首页 > 代码库 > uva 11584
uva 11584
这题说的是给了长度为n的字符串, 将这个字符串分成k个子串,求使得这个k尽量的小的最小值,当这个长度为n的字符串本身就是回文串的时候,那么k为1。
考虑第i个字符和前i-1个中的第j个搭配形成回文子串,开一个数组标记一下就可以知道了这个从j到i是否是回文子串然后,每次取最小,我们发现这样是一个最优的子结构然后 我们推出 dp[i]= min(dp[j-1]+1){str[i] 与str[j]之间形成了回文串的j};
#include <iostream>#include <cstdio>#include <algorithm>#include <string.h>#include <cmath>using namespace std;const int maxn=1005;const int INF = 10000000;int dp[maxn],Len;bool vis[maxn][maxn];void inti(){ for(int i =0; i<=Len; i++) for( int j =i+1; j <=Len ; ++j ) vis[i][j]=false;}char str[maxn];int main(){ int cas; for( int i =0; i<= 1000; i++ ) for(int j=0 ; j<=i; j++) vis[i][j] = true; scanf("%d",&cas); for(int cc=1; cc<= cas; ++ cc){ scanf("%s",str+1); Len = strlen(str+1); dp[0]=0; inti(); for(int i =1; i<=Len; ++i){ dp[i]=dp[i-1]+1; for(int j =1; j<i; ++j ) if(str[i]==str[j]&&vis[j+1][i-1]==true){ vis[j][i]=true; dp[i]=min(dp[j-1]+1,dp[i]); } } printf("%d\n",dp[Len]); } return 0;}
uva 11584
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。