摘要:题目大意 给定一个长度不超过5*10^4的只包含小写字母的字符串,要求你求它的回文子序列,如果存在长度为100的回文子序列,那么只要输出长度为一百的回文子序列即可,否则输出它的最长回文子序列 题解 这个题很考验思维~~~相当不错的题,想到了就很简单,其实也就是充分利用题设。n的规模为5*10^4,如果不进行一些处理直接上O(n^2)算法肯定会超时,但是题目里有个很重要的条件,那就是如果存在长度为1...
阅读全文
摘要:这次做了ABC三题,D题知道是线段树,但是没能在二十分钟内写出来,弱成渣了,看来果断以后还得刷刷线段树,C题最终测试的时候悲剧了,Wrong answer on test34。赛后稍微改了下A了,D题也A 了。总得来说毛病还很多,这次的题目除了最后一题,其他的真心不难,做出四道题目来应该来说很简单,但是我还是只做出两道来。分析一下原因,还是自己能力不够,手速不够快,看英语题目也看得很慢,然后还没看...
阅读全文
摘要:在刷ZeroClock大神的区间DP专辑,遇见了ZOJ3469,完全不无从下手,然后有人说是论问题,推荐看徐源盛《对一类动态规划问题的研究》这篇论文,果断得膜拜了下,感觉好神奇,可以把未来的费用提前计算好~~~顺便把相关的三道题A了,其实都是一样的。。。 BZOJ2037 [Sdoi2008]Sue的小球 题目大意 中文的。。。 题解 这是论文的例题 直接上原文的讲解吧。。。 把dp数组初始化为...
阅读全文
摘要:题目大意 给定一个N*N的格子,每个格子里有一个非负数,要求你找出从左上角到右下角的一条路径,使得它满足路径上的格子里的数全部乘起来的积尾部0最少 题解 如果要产生0肯定是2*5得出来的,最终的乘积可以表示为2^x*5^y*C,那么零的个数就是min(x,y)。我们可以先对每个格子里的数预处理下,计算出2和5的个数来,然后DP分别求出2和5的最小个数然后选两者中的最小值,输出路径方法没啥说的,很传...
阅读全文
摘要:题目大意 给你一张宽为w,长为h的的贺卡,然后给你n个信封,每个信封宽为wi,长为hi,问你最多能在贺卡上嵌套多少个信封,如果某个信封i如果能够装在信封j里,当且仅当w[i]#include #include #include using namespace std;#define MAXN 5006int pre[MAXN],dp[MAXN];pair,int> a[MAXN];void...
阅读全文
摘要:题目大意 有两个长度分别为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n^2之间的整数。两个序列的第一个元素均为1.求出A和B的最长公共子序列长度。 题解 这个是大白书上的例题,不过这题真的很好,很考验思维。因为p和q都是250^2=62500,如果用LCS的话时间复杂度是O(pq),显然会超时。。。。不过这题的两个序列很特殊,就是没有重复的元素,这样可以把A中的元素重新编号为1...
阅读全文
摘要:题目大意 给定一个长度为n的整数序列,求个最长子序列(不一定连续),使得该序列的长度为奇数2k+1,前k+1个数严格递增,后k+1个数严格递减。注意,严格递增意味着该序列中的两个相邻数不能相同。n#include #include #include using namespace std;#define MAXN 10005int a[MAXN],c[MAXN],d[MAXN];int n;vo...
阅读全文
摘要:题目大意 给定一个包含n(n#include #include #include using namespace std;#define MAXN 105#define INF 0x7fffffffint dp[MAXN*2][MAXN];bool grah[MAXN][MAXN];int a[MAXN*2];int main(){ int T; scanf("%d",&T); ...
阅读全文
摘要:题目大意 给定一个字符串,要求你删除尽量少的字符,使得原字符串变为最长回文串,并把回文串输出,如果答案有多种,则输出字典序最小的 题解 有两种解法,第一种是把字符串逆序,然后求两个字符串的LCS,并记录LCS,长度就等于最长回文串的长度,不过求出来的LCS不一定是回文串,例如下面这个例子 s = 1 5 2 4 3 3 2 4 5 1reverse(s) = 1 5 4 2 3 3...
阅读全文
摘要:题目大意 要求你对一个合法的括号序列进行染色,并且需要满足以下条件 1、要么不染色,要么染红色或者蓝色 2、对于任何一对括号,他们当中有且仅有一个被染色 3、相邻的括号不能染相同的颜色 题解 用区间dp[i][j][cl][cr]表示区间[i,j]被染色之后(第i个括号被染成cl色,第j个括号被染成cr色)的合法方案数 分为匹配和不匹配两种情况来处理,需要用到乘法原理,用记忆化比较好写~~~具体请...
阅读全文
摘要:题目大意 给定两个序列,要求你求出最长公共上升子序列 题解 LIS和LCS的合体,YY好久没YY出方程,看了网友的题解,主要是参考aikilis的,直接搬过来好了 经典的动态规划优化。 用opt[i][j]表示s[0..i-1]与t[0..j-1]的以t[j-1]结尾的最长上升公共子序列的长度,那么最后的答案是max{opt[n][j] | 1#include #include #include ...
阅读全文
摘要:题目大意 给定一个字符串s,q个查询,每次查询返回s[l…r]含有的回文子串个数(题目地址) 题解 和有一次多校的题目长得好相似,这个是回文子串个数,多校的是回文子序列个数 用dp[i][j]表示,s[i..j]含有的回文子串个数,则dp[i][j]=dp[i][j-1]+dp[i+1][j]-dp[i+1][j-1]+flag[i][j](如果s[i..j]是回文子串则flag[i][j]=1,...
阅读全文
摘要:题目大意 给定一个字符串S,问最少插入多少个字符可以使字符串S变为回文串 题解 用dp[i][j]表示把字符串s[i…j]变为回文串需要插入的最小字符数 如果s[i]==s[j]那么dp[i][j]=dp[i+1][j-1] 如果s[i]!=s[j]那么dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1 可以用滚动数组优化一下空间 代码: #include#include#...
阅读全文
摘要:题目大意 给定一个数N,问由不同的2的幂之和能组成N的方法有多少种 题解 看完题目立马想到完全背包。。。敲完代码上去超时了。。。。后来发现是%的原因。。。改成减法就A了。。。%也太他妈耗时了吧!!!(还有一种O(n)的算法。。。) 代码: #include#include#define MOD 1000000000#define MAXN 1000005int dp[MAXN];int main(...
阅读全文
摘要:题目大意 给定两段文本,问公共单词有多少个 题解 裸LCS。。。 代码: #include#includeusing namespace std;#define MAXN 105string x[MAXN],y[MAXN];int path[MAXN][MAXN],dp[MAXN][MAXN];int n,m;void work(){ for(int i=1; i>s) { ...
阅读全文
摘要:题目大意 现有一个天平,它有C个挂钩和G个砝码,问有多少种方法可以使得天平平衡(砝码必须用完) 题解 其实就是让背包容量为0的方法有多少种方法,但是这样的话背包容量会出现负数,所以可以平移一下,背包容量最大值为20*25*15=7500,即平移量为7500,最后答案就是dp[G][7500] 代码: #include#include#includeusing namespace std;#defi...
阅读全文
摘要:题目大意给定字符串X和Y,可以对字符串进行一下三种操作:1、删除一个字符2、插入一个字符3、替换一个字符每个操作代价是1,问运用以上三种操作把X变为Y所需的最小步数是多少?题解定义dp[i][j]为把X的前i个字符转换为Y的前j个字符所需的最小步数如果X[i]==Y[j]则dp[i][j]=dp[i-1][j-1]如果X[i]!=Y[j]则dp[i][j]=min(dp[i-1][j-1]+1,dp[i-1][j]+1,dp[i][j-1]+1)代码:#include#include#includeusing namespace std;#define MAXN 1005char x[MAXN
阅读全文
摘要:题目大意 一队士兵排成一条直线,问最少出队几个士兵,使得队里的每个士兵都可以看到又端点或者左端点 题解 从左往右搞一遍LIS,然后从右往左搞一遍LIS,然后枚举即可。。。 代码: #include#include#include#includeusing namespace std;#define MAXN 1005double a[MAXN];int d[MAXN],c[MAXN];int ma...
阅读全文
摘要:题目大意 给定一个字符串,要求你通过插入和删除操作把它变为回文串,对于每个字符的插入和删除都有一个花费,问你把字符串变为回文串最少需要多少花费 题解 看懂题立马YY了个方程,敲完就交了,然后就A了,爽歪歪,哈哈~~~ dp[i][j]表示把s[i..j]变为回文的最小花费,设cost[0][ch-‘a’]和cost[1][ch-‘a’]分别为插入字符ch和删除字符ch的花费 如果s[i]==s[j...
阅读全文
摘要:题目大意 给定三个字符串s1,s2,s3,判断由s1和s2的字符能否组成字符串s3,并且要求组合后的字符串必须是s1,s2中原来的顺序、 题解 用dp[i][j]表示s1的前i个字符和s2的前j个字符能否组成s3的前i+j个字符,有两个子问题,dp[i-1][j]和dp[i][j-1],如果dp[i-1][j]为真并且s1[i]==s3[i+j]或者dp[i][j-1]为真并且s2[j]==s3[...
阅读全文
摘要:题目大意 给定一个小写字母组成的字符串S,你的任务是划分成尽量少的回文串 题解 方程就是dp[j]=min(dp[i-1]+1)(i#include#include#includeusing namespace std;#define MAXN 1005char s[MAXN];int dp[MAXN];bool check(int l,int r){ int len=(l+r)/2; ...
阅读全文
摘要:题目大意 给定两个数a,b的GCD和LCM,要求你求出a+b最小的a,b 题解 GCD(a,b)=G GCD(a/G,b/G)=1 LCM(a/G,b/G)=a/G*b/G=a*b/G^2=L/G 这样的话我们只要对L/G进行质因数分解,找出最接近√(L/G)的因子p,最终结果就是a=p*G,b=L/p,对(L/G)就是套用Miller–Rabin和Pollard's rho了,刚开始Pollar...
阅读全文
摘要:题目大意 给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子 题解 看了一整天《初等数论及其应用》相关部分,终于把Miller–Rabin和Pollard's rho这两个算法看懂了O(∩_∩)O~~ Miller–Rabin主要用到了费马小定理,即:设p是一个素数,a是一个正整数且p不整除a,则ap-1≡1(mod p).若x=b(n-1)/2,x2=bn-1≡1(mod n)...
阅读全文
摘要:题目大意 求最小整数x,满足x≡a[i](mod m[i])(没有保证所有m[i]两两互质) 题解 中国剩余定理显然不行。。。。只能用方程组两两合并的方法求出最终的解,刘汝佳黑书P230有讲~~具体证明和实现我是参考此大神的 代码: #includeusing namespace std;#define MAXN 100000typedef long long LL;LL m[MAXN],a[MA...
阅读全文
摘要:题目大意 略。。。有中文。。。 题解 就是解同余方程组 x≡(p-d)(mod 23) x≡(e-d)(mod 28) x≡(i-d)(mod 33) 最简单的中国剩余定理应用。。。。 代码: #include#includeusing namespace std;void gcd(int a,int b,int &d,int &x,int &y){ if(!b) { d...
阅读全文
摘要:题目大意 求同余方程Cx≡B-A(2^k)的最小正整数解 题解 可以转化为Cx-(2^k)y=B-A,然后用扩展欧几里得解出即可。。。 代码: #include using namespace std;typedef long long LL;void extended_gcd(LL a,LL b,LL &d,LL &x,LL &y){ if(!b) { d=a,x=1,...
阅读全文
摘要:题目大意 给定一个数的质因子表达式,要求你计算机它的值,并减一,再对这个值进行质因数分解,输出表达式 题解 预处理一下,线性筛法筛下素数,然后求出值来之后再用筛选出的素数去分解。。。。其实主要就是字符串处理。。。 代码: #include #include #include #define MAXN 10000char str[MAXN],s[MAXN][7];int prime[MAXN*5],...
阅读全文
摘要:题目大意 给定N,要求你计算用连续的素数的和能够组成N的种数 题解 先筛选出素数,然后暴力判断即可。。。 代码: #include#includeusing namespace std;#define MAXN 10000int prime[MAXN+5],cnt;bool check[MAXN+5];void get_prime(){ cnt=0; memset(check,fa...
阅读全文
摘要:题目大意 N!末尾0的个数 题解 0只能由2*5产生,所以只要求2,5有多少对即可,又因为10!中5的个数少于2,所以只要求因子5有多少个即可,答案即为N/5+N/25+N/125.. 代码: #includeint main(void){ int T; scanf("%d",&T); while(T--) { int n,ans=0; scan...
阅读全文
摘要:题目大意 求N!有多少位 题解 用公式直接秒杀。。。 代码: #include#includeusing namespace std;#define ESP 1e-9#define Pi acos(-1)#define e exp(1.0)int main(){ int T; cin>>T; while(T--) { int digit; dou...
阅读全文