您的位置:首页 > 其它

uva 11584 Partitioning by Palindromes

2015-03-29 09:11 260 查看

紫皮书!

题意:给你小写字母组成的字符串,让你划分为尽量少的回文串。

思路:dp[i] 为0 - i 划分的最小的回文串的个数 则 dp[i] = min{dp[i],dp[j]+1} 如果 j+1 到 i 是回文串的话 (PS: 是 j+1 到 i 是回文串 而不是 j 到 i 是回文串)

先把 从 i - j 是回文串 处理一下然后dp

总之水题……

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <cstdlib>
const int INF = 0xfffffff;
const double ESP = 10e-8;
const double Pi = atan(1) * 4;
const int MOD = 1000007;
const int MAXN = 1000 + 10;
typedef long long LL;
using namespace std;

char str[MAXN];
bool isPart[MAXN][MAXN];
int dp[MAXN];
int main(){
//freopen("input.txt","r",stdin);
int n;
scanf("%d",&n);
while(n--){
scanf("%s",str);
memset(isPart,0,sizeof(isPart));
int len = strlen(str);
for(int i = 0;i < len;i++){
for(int j = i;j < len;j++){
bool flag = 1;
for(int k = 0;k <= (j-i)/2;k++){
if(str[k+i] != str[j-k]){
flag = 0;
break;
}
}
if(flag){
isPart[i+1][j+1] = isPart[j+1][i+1] = 1;
}
}
}
for(int i = 1;i <= len;i++){
dp[i] = INF;
}
dp[1] = 1;
for(int i = 1;i <= len;i++){
for(int j = 0;j < i;j++){
if(isPart[j+1][i]){
dp[i] = min(dp[i],dp[j]+1);
}
}
}
printf("%d\n",dp[len]);
}
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: