POJ 8471 切割回文 dp北大ACM/ICPC竞赛训练

Posted zhenghanghu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 8471 切割回文 dp北大ACM/ICPC竞赛训练相关的知识,希望对你有一定的参考价值。

 

 1 #include<iostream>
 2 #include<vector>
 3 #define INF 100000
 4 using namespace std;
 5 
 6 string s;
 7 char a[1005];
 8 vector<int> hui[1005];//hui[i]里的k指 k到i组成回文
 9 int dp[1005];//dp[i]代表前i个字符要切几刀 
10 
11 int main(){
12     int t; cin>>t;
13     while(t--){
14         cin>>s;
15         int n = s.length();
16         for(int i=0;i<n;i++) a[i+1] = s[i];
17         for(int i=1;i<=n;i++) dp[i]=INF;
18         
19         hui[1].push_back(1);//第一个跟自己组成回文 
20         for(int i=2;i<=n;i++){
21             hui[i].push_back(i);//自己跟自己组成回文
22             if(a[i]==a[i-1]) hui[i].push_back(i-1);
23             for(int j=0;j<hui[i-1].size();j++){//看i的上一个字符,能与哪些字符组成回文 
24                 int k = hui[i-1][j];
25                 if( a[k-1]==a[i] ) hui[i].push_back(k-1);
26             }
27         }
28         
29         dp[0]=-1;
30         dp[1]=0;
31         for(int i=2;i<=n;i++){
32             for(int j=0;j<hui[i].size();j++) dp[i] = min(dp[i], dp[ hui[i][j]-1 ]+1 );
33         }
34         
35         cout<<dp[n]<<endl;
36         for(int i=1;i<=n;i++) hui[i].clear(); 
37     }
38 
39     return 0;    
40 }

 

以上是关于POJ 8471 切割回文 dp北大ACM/ICPC竞赛训练的主要内容,如果未能解决你的问题,请参考以下文章

Bailian4122 切割回文DP

POJ 8464 股票买卖 dp北大ACM/ICPC竞赛训练

POJ 1194 Zipper dp北大ACM/ICPC竞赛训练

POJ 4979 海贼王之伟大航路 状压dp北大ACM/ICPC竞赛训练

poj 3280 回文字符串问题 dp算法

POJ3280 Cheapest Palindrome回文+DP