标签:get blog inpu 方式 .com pid pre strlen file
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1154
输入字符串S(S的长度<= 5000)。
输出最少的划分数量。
abbaabaa
3
原本以为N^2会爆炸后来发现好像也不会= =倒是题意搞懵逼我了,题意是必须全部划分为回文子串,求最少划分几个,我以为可以出现非回文子串,就是0......天真
dp[i]表示前i个字符的答案,第i个字符可能单独也可能与前面的某一串相连构成一个回文串,答案就是 dp[i]=MIN{dp[j]+1 | j<i&&j+1--i构成回文串}
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 #define inf 0x3f3f3f3f 5 LL mod=1e9+7; 6 int dp[5005]; 7 char s[5005]; 8 bool ok(int a,int b) 9 { 10 int m=b-((b-a)>>1); 11 for(int i=a,j=b;i<=m;++i,--j) 12 if(s[i]!=s[j]) return 0; 13 return 1; 14 } 15 int main() 16 { 17 int N,i,j; 18 scanf("%s",s+1); 19 N=strlen(s+1); 20 for(i=1;i<=N;++i) 21 { 22 dp[i]=dp[i-1]+1; 23 for(j=0;j<i;++j) 24 { 25 if(ok(j+1,i)&&dp[i]>dp[j]+1) dp[i]=dp[j]+1; 26 } 27 } 28 printf("%d\n",dp[N]); 29 return 0; 30 }
标签:get blog inpu 方式 .com pid pre strlen file
原文地址:http://www.cnblogs.com/zzqc/p/7397123.html