题意:给出一个字符串,问最少能够划分成多少个回文串
dp[i]表示以第i个字母结束最少能够划分成的回文串的个数
dp[i]=min(dp[i],dp[j]+1)(如果从第j个字母到第i个字母是回文串)
想不明白的还是初始化
初始化为:dp[i]=i+1,
后来= =,发现应该是这样的
从第1个字母到第i个字母最多能够划分成i+1个回文串,
所以为了求最小值,每一个初始值初始化为一个极大地值, 所以dp[i]初始化为INF也可以
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 #define mod=1e9+7; 12 using namespace std; 13 14 typedef long long LL; 15 const int maxn=1005; 16 char s[maxn]; 17 int dp[maxn]; 18 19 int ispalind(int l,int r){ 20 while(l<r){ 21 if(s[l]!=s[r]) return 0; 22 ++l;--r; 23 } 24 return 1; 25 } 26 27 int main(){ 28 int t,i,j,len; 29 scanf("%d",&t); 30 while(t--){ 31 cin>>(s+1); 32 len=strlen(s+1); 33 34 memset(dp,0,sizeof(dp)); 35 36 for(i=1;i<=len;i++){ 37 dp[i]=i+1;//这儿只要初始化为一个大于等于i+1的数就 可以 38 for(j=1;j<=i;j++){ 39 if(ispalind(j,i)) dp[i]=min(dp[i],dp[j-1]+1); 40 } 41 } 42 43 printf("%d\n",dp[len]); 44 } 45 return 0; 46 }
时间: 2024-10-13 15:43:32