UVa11584Partitioning by Palindromes(字符串区间dp)
2015-04-28 19:03
501 查看
UVa11584Partitioning by Palindromes(字符串区间dp)
题意:给定一个字符串s, 问说最少可以划分成几个回文串。
思路:dp[i]表示从1到第i个字符最少可以划分为几个回文,状态转移方程
dp[i] = min(dp[i], dp[j-1]+1), 如果满足 s[j] 到 s[i] 为回文字符串。
用 judge 函数判断从j到i是否可以形成回文串。
Sample Input
3
racecar
fastcar
aaadbccb
Sample Output
1
7
3
题意:给定一个字符串s, 问说最少可以划分成几个回文串。
思路:dp[i]表示从1到第i个字符最少可以划分为几个回文,状态转移方程
dp[i] = min(dp[i], dp[j-1]+1), 如果满足 s[j] 到 s[i] 为回文字符串。
用 judge 函数判断从j到i是否可以形成回文串。
Sample Input
3
racecar
fastcar
aaadbccb
Sample Output
1
7
3
<span style="font-size:18px;">#include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <string> #include <algorithm> #include <queue> #include <stack> using namespace std; const double PI = acos(-1.0); const double e = 2.718281828459; const double eps = 1e-8; const int MAXN = 1010; char s[MAXN]; int dp[MAXN]; int judge(int l, int r) { while(l <= r) { if(s[l] != s[r]) return 0; l++; r--; } return 1; } int main() { //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); int Case; cin>>Case; while(Case--) { scanf("%s", s+1); int len = strlen(s+1); dp[0] = 0; for(int i = 1; i <= len; i++) dp[i] = 1010; for(int i = 1; i <= len; i++) { for(int j = 1; j <= i; j++) { if(judge(j, i)) dp[i] = min(dp[i], dp[j-1]+1); } } cout<<dp[len]<<endl; } return 0; }</span>
相关文章推荐
- UVA 4394 - String painter(字符串区间DP)
- uva 1630 KMP判断周期串 和 区间DP 压缩字符串
- uva 10453 Make Palindrome(区间DP->回文字符串的最小生成)
- UVA 字符串区间DP
- uva 1351 String Compression(字符串区间dp)
- HYSBZ 1090 字符串折叠(区间dp)
- UVA 题目10453 Make Palindrome(区间DP,打印路径)
- uva 10453 Make Palindrome (区间DP + 递归输出)
- UVA - 662 Fast Food 区间DP
- UVA - 11584 划分字符串的回文串子串; 简单dp
- UVA - 10891 Game of Sum(记忆化搜索 区间dp)
- UVA 10559 Blocks(区间DP&&递推)
- UVAlive 4857 - Halloween Costumes 区间dp
- UVA 1619 - Feel Good(dp 求区间最小值 附加RMQ)(区间最小值优化)
- 区间DP UVA 1351 String Compression
- uva1351 - String Compression 区间DP
- UVALive 6529 Eleven 区间dp
- UVA - 10003 Cutting Sticks (区间dp)
- UVA 10739 String to Palindrome (区间dp)
- UVA 10529 - Dumb Bones(概率+区间dp)