标签:
看了lujiaxin的blog,感觉自己好浪啊。。。。好难过
刷题的时候不够投入,每种算法都是只写一两道就过去了,这样怎么可能进步嘛
不要总是抱怨时间太少了 都是自己不努力>_<
好啦 看题
n<=50的范围,记忆化。。。N^3
f[a][b][t]表示a~b这段区间内,有没有M的最短答案。
枚举断点(很重要的思想),当T==1,显然左边右边都dp一下;(think clearly)
然后,看看左边能不能被压缩,这一句很重要,因为如果区间内没有M的话,它只能是最左边复制呀复制,所以可以保证正确性;
标算思路好严谨啊,感觉自己DP能力还要多学习
PS.submit的时候看到别人在做3110,代码真心很短的树套树,好想写啊~
月考加油啦~\(≧▽≦)/~
#include<cstdio> #include<algorithm> #include<cstring> char s[200];int f[60][60][2],mark[60][60][2]; using namespace std; bool same(int a,int b) { int l=b-a+1;if(l%2==1)return 0; for(int i=a;i<=(a+b)/2;i++) if(s[i]!=s[i+l/2])return 0; return 1; } int dp(int a,int b,int t) { int tmp=b-a+1,l=b-a+1;if(tmp==1)return 1; if(mark[a][b][t])return f[a][b][t];mark[a][b][t]=1; if(t>0)for(int i=a;i<b;i++)tmp=min(tmp,dp(a,i,1)+dp(i+1,b,1)+1); for(int i=a;i<b;i++)tmp=min(tmp,dp(a,i,t)+b-i); if(same(a,b))tmp=min(tmp,dp(a,(a+b)/2,0)+1); f[a][b][t]=tmp;return tmp; } int main() { scanf("%s",s+1); int len=strlen(s+1); printf("%d",dp(1,len,1)); }
标签:
原文地址:http://www.cnblogs.com/wxxlouisa/p/5375312.html