ACM 动态规划初步 Partitioning by Palindromes

来源:互联网 发布:美洽电脑软件下载 编辑:程序博客网 时间:2024/04/29 19:37

题目大意:给你一些字符串,让你求这些字符串所能分割成的回文字符串的最小数量,比如aaa,为1;abc,只能一个一个字符拆分,所以是3;aaabdccd,为3;等等。

结题思路:用动态规划解决这个问题。一个一个字符加进去,看看能否构成回文,如果能构成回文,该状态下的最优解是多少,如果一直不能,则该状态下的最优解为前者状态的最优解情况下再加上一。这样每个循环一遍就可以得出问题的答案。

代码如下:

#include<iostream>#include<string>#include<cstring>#include<algorithm>using namespace std;int dp[1002];//存放某个状态时候的最优解数据 char num[1002];//存放字符 int check(int l,int r)//定义检查的函数 {int f=1;for(int i=0;i<(r-l)/2+1;i++){if(num[l+i]!=num[r-i]){f=0;break;}}return f;}int main(){int N,M;string s;int i,j,sum=0,tem;int max=100000;for(;cin>>N;){while(N--){num[0]='0';cin>>s;int len=s.length();for(i=1;i<=len;i++)num[i]=s[i-1];for(i=1;i<=len;i++){int minx=max;for(j=0;j<i;j++){if (check(j+1,i)){//如果检查通过,则在该状态下的最优解上加一作为目前的最优解; tem=dp[j]+1;}else {tem=dp[j]+i-j;}//如果没有通过,则考虑最坏的情况会是怎么样; //cout<<"@@@@@"<<tem<<endl;minx=min(minx,tem);//一直取最小的,这样就能保证整个搜索下来得到的是最优解 //cout<<"#####"<<minx<<endl;}dp[i]=minx;//该状态下的最优解 //cout<<dp[i]<<endl;}cout<<dp[len]<<endl;}}}