UVa 11584 Partitioning by Palindromes【DP】

题意:给出一个字符串,问最少能够划分成多少个回文串

dp[i]表示以第i个字母结束最少能够划分成的回文串的个数

dp[i]=min(dp[i],dp[j]+1)(如果从第j个字母到第i个字母是回文串)

想不明白的还是初始化

初始化为:dp[i]=i+1,

后来= =,发现应该是这样的

从第1个字母到第i个字母最多能够划分成i+1个回文串,

所以为了求最小值,每一个初始值初始化为一个极大地值, 所以dp[i]初始化为INF也可以

 #include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
#define mod=1e9+7;
using namespace std; typedef long long LL;
const int maxn=;
char s[maxn];
int dp[maxn]; int ispalind(int l,int r){
while(l<r){
if(s[l]!=s[r]) return ;
++l;--r;
}
return ;
} int main(){
int t,i,j,len;
scanf("%d",&t);
while(t--){
cin>>(s+);
len=strlen(s+); memset(dp,,sizeof(dp)); for(i=;i<=len;i++){
dp[i]=i+;//这儿只要初始化为一个大于等于i+1的数就 可以
for(j=;j<=i;j++){
if(ispalind(j,i)) dp[i]=min(dp[i],dp[j-]+);
}
} printf("%d\n",dp[len]);
}
return ;
}
上一篇:用grunt搭建自动化的web前端开发环境


下一篇:python安装——Windows平台