UVa11584 Partitioning by Palindromes
2017-07-31 08:21
323 查看
题目描述
求最少能划成多少个回文串,比较简单。
设f(i)为前i个字符组成的串最少能划分成多少个。
f(i)=min(f(j)+1) (j+1~i是回文串)
如果临时判断回文串要O(n)的时间。
总时间复杂度O(n3)
用O(n2)的时间预处理后可降为O(1)
总时间复杂度降为O(n2)
代码
求最少能划成多少个回文串,比较简单。
设f(i)为前i个字符组成的串最少能划分成多少个。
f(i)=min(f(j)+1) (j+1~i是回文串)
如果临时判断回文串要O(n)的时间。
总时间复杂度O(n3)
用O(n2)的时间预处理后可降为O(1)
总时间复杂度降为O(n2)
代码
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; char s[1010]; bool is[1010][1010]; int f[1010]; int main(){ int t; cin>>t; while(t--){ scanf("%s",s+1); int l=strlen(s+1); memset(is,0,sizeof(is)); for(int i=1;i<=l;i++){ for(int k=0;i-k>0&&i+k<=l;k++) if(s[i-k]==s[i+k]) is[i-k][i+k]=1; else break; if(s[i]==s[i+1]){ for(int k=0;i-k>0&&i+k+1<=l;k++) if(s[i-k]==s[i+k+1]) is[i-k][i+k+1]=1; else break; } } f[0]=0; for(int i=1;i<=l;i++){ f[i]=i; for(int j=0;j<i;j++){ if(is[j+1][i]) f[i]=min(f[i],f[j]+1); } } printf("%d\n",f[l]); } return 0; }
相关文章推荐
- UVA 11584 Partitioning by Palindromes (区间DP)
- 【线性结构上的动态规划】UVa 11584 - Partitioning by Palindromes
- UVA 题目11584 - Partitioning by Palindromes(DP)
- uva11584 Partitioning by Palindromes
- UVA 11584 - Partitioning by Palindromes
- UVa-11584 - Partitioning by Palindromes
- UVa 11584 - Partitioning by Palindromes
- UVa11584 Partitioning by Palindromes
- 【动态规划】[UVa11584]Partitioning by Palindromes
- UVA 11584 - Partitioning by Palindromes(基础dp)
- UVA 11584 Partitioning by Palindromes
- uva 11584 - Partitioning by Palindromes(DP)
- UVA - 11584 Partitioning by Palindromes
- UVa 11584 Partitioning by Palindromes(DP)
- uva 11584 - Partitioning by Palindromes(简单dp)
- uva 11584 Partitioning by Palindromes 线性dp
- UVA 11584 - Partitioning by Palindromes
- UVA 11584 Partitioning by Palindromes
- 【UVA 11584】【简单dp】Partitioning by Palindromes【给定一个字符串, 问最少分为几部分可使各部分均为回文串】
- uva 11584 - Partitioning by Palindromes(dp)