UVa 11584 Partitioning by Palindromes【DP】

题意:给出一个字符串,问最少能够划分成多少个回文串

dp[i]表示以第i个字母结束最少能够划分成的回文串的个数

dp[i]=min(dp[i],dp[j]+1)(如果从第j个字母到第i个字母是回文串)

想不明白的还是初始化

初始化为:dp[i]=i+1,

后来= =,发现应该是这样的

从第1个字母到第i个字母最多能够划分成i+1个回文串,

所以为了求最小值,每一个初始值初始化为一个极大地值, 所以dp[i]初始化为INF也可以

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include <cmath>
 5 #include<stack>
 6 #include<vector>
 7 #include<map>
 8 #include<set>
 9 #include<queue>
10 #include<algorithm>
11 #define mod=1e9+7;
12 using namespace std;
13
14 typedef long long LL;
15 const int maxn=1005;
16 char s[maxn];
17 int dp[maxn];
18
19 int ispalind(int l,int r){
20     while(l<r){
21         if(s[l]!=s[r]) return 0;
22         ++l;--r;
23     }
24     return 1;
25 }
26
27 int main(){
28     int t,i,j,len;
29     scanf("%d",&t);
30     while(t--){
31         cin>>(s+1);
32         len=strlen(s+1);
33
34         memset(dp,0,sizeof(dp));
35
36         for(i=1;i<=len;i++){
37             dp[i]=i+1;//这儿只要初始化为一个大于等于i+1的数就 可以
38             for(j=1;j<=i;j++){
39                 if(ispalind(j,i)) dp[i]=min(dp[i],dp[j-1]+1);
40             }
41         }
42
43         printf("%d\n",dp[len]);
44     }
45     return 0;
46 }

时间: 2024-10-13 15:43:32

UVa 11584 Partitioning by Palindromes【DP】的相关文章

uva 11584 Partitioning by Palindromes 线性dp

// uva 11584 Partitioning by Palindromes 线性dp // // 题目意思是将一个字符串划分成尽量少的回文串 // // f[i]表示前i个字符能化成最少的回文串的数目 // // f[i] = min(f[i],f[j-1] + 1(j到i是回文串)) // // 这道题还是挺简单的,继续练 #include <algorithm> #include <bitset> #include <cassert> #include <

UVA - 11584 Partitioning by Palindromes[序列DP]

UVA - 11584 Partitioning by Palindromes We say a sequence of char- acters is a palindrome if it is the same written forwards and backwards. For example, ‘racecar’ is a palindrome, but ‘fastcar’ is not. A partition of a sequence of characters is a lis

uva 11584 Partitioning by Palindromes(dp)

题目链接 题意:给定一个字符串,分解成多个子串,每个子串都是回文串,问最少能分成多少个子串. 题解: dp[i]表示前i个字符串分割成最少回文子串的数量: 0<=j<=i;如果字符串从j到i是回文串,那么dp[i]=min(dp[i],dp[j-1]+1); #include <iostream> using namespace std; int dp[1005]; string s; bool ok(int j,int i) { while(j<=i) { if(s[j]!

UVa 11584 Partitioning by Palindromes (简单DP)

题意:给定一个字符串,求出它最少可分成几个回文串. 析:dp[i] 表示前 i 个字符最少可分成几个回文串,dp[i] = min{ 1 + dp[j-1] | j-i是回文}. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath&g

UVa 11584 Partitioning by Palindromes

/*---UVa 11584 Partitioning by Palindromes --用dp[i]表示前i个字母划分成最小回文串的个数,则有dp[i]=min{dp[j]+1}s[j+1...i]是一个回文串,状态O(n)个 每次有O(n)个决策,而判断是否是回文串复杂度O(n),这样总的复杂度O(n^3).如果事先预处理标记一下s[i...j]是否构成 回文串,这样总的复杂度O(n^2).标记s[i...j]是否构成回文串,用vis[i][j](i<=j)来标记,if s[i]!=s[j]

区间DP UVA 11584 Partitioning by Palindromes

题目传送门 1 /* 2 题意:给一个字符串,划分成尽量少的回文串 3 区间DP:状态转移方程:dp[i] = min (dp[i], dp[j-1] + 1); dp[i] 表示前i个字符划分的最少回文串, 4 如果s[j] 到 s[i]是回文串,那么可以从dp[j-1] + 1递推过来 5 */ 6 #include <cstdio> 7 #include <cstring> 8 #include <algorithm> 9 #include <cmath&g

Uva 11584 - Partitioning by Palindromes dp

Problem H: Partitioning by Palindromes We say a sequence of characters is a palindrome if it is the same written forwards and backwards. For example, 'racecar' is a palindrome, but 'fastcar' is not. A partition of a sequence of characters is a list o

UVa 11584 Partitioning by Palindromes(DP 最少对称串)

题意  判断一个串最少可以分解为多少个对称串   一个串从左往后和从右往左是一样的  这个串就称为对沉串 令d[i]表示给定串的前i个字母至少可以分解为多少个对称串  那么对于j=1~i   若(i,j)是一个对称串  那么有  d[i]=min(d[i],d[j-1]+1)   然后就得到答案了 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N

uva 10154 - Weights and Measures【dp】qi

题意:uva 10154 - Weights and Measures 题意:有一些乌龟有一定的体重和力量,求摞起来的最大高度.力量必须承受其上面包括自己的全部的重量. 分析:先按其能举起来的力量从小到大排序 然后定义dp[i] 表示摞起来 i 只乌龟的最小质量. 然后转移就是每次用遍历O(n)的复杂度找最小的,然后记录,保存最大值即可. AC代码: #include<iostream> #include<cstdio> #include<cstring> #inclu