uva 11584 Partitioning by Palindromes | dp

来源:互联网 发布:中商惠民员工被优化 编辑:程序博客网 时间:2024/05/16 02:13

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=2631

算是刚开始认真做dp吧,觉得dp真的好神奇,而且在做之前的省赛题(浙江)时,总能发现一两道是dp。虽说这题是在看了别人的思路下写出来的,不过对我而言,还是益处很大的,写写博客,加深印象!

题意:

给你一个字符串,让你求出最小的回文段数。

思路:

dp[i]表示在第i个字母时加入时最小的回文段数。

可以用这个方程进行转移:dp[i] = min(dp[i],dp[j-1]+1);j的范围[1,i];

意思是:如果从j到i是回文,那么dp[i]的回文段数等于j-1前的回文段数加上1;


AC代码:

<span style="font-size:18px;">#include <cstdio>#include <cstring>#include <iostream>#include <string>using namespace std;const int P = 1005;char tmp[P];int dp[P];bool Charge(int i,int j){int mid = (i+j)/2;while(j<=mid){if(tmp[j++] != tmp[i--])return 0;}return 1;}int main(){int T;cin>>T;while(T--){scanf("%s",tmp+1);memset(dp,-1,sizeof(dp));dp[0] = 0;int len = strlen(tmp+1);for(int i = 1;i <= len;i++){for(int j = 1;j <= i;j++){if(dp[i] == -1)dp[i] = dp[i-1]+1;if(Charge(i,j)){dp[i] = min(dp[i],dp[j-1]+1);}}}cout<<dp[len]<<endl;}return 0;}</span>

*其实感觉是UVa数据有点弱,这个如果换作变态点数据,可能就TLE了。后来把字符串(1...len)预处理判断回文,但时间跑得更久了...



0 0