UVA 11584 dp
2015-08-16 00:26
393 查看
UVA 11584 - Partitioning by Palindromes
求一个字符串最少可以被分为几个回文字串。如aaadbccb 可以被分为aaa d bccb 三个。
n^2预处理出w[i][j],即i到j段是否为回文。为回文的条件为s[i] == s[j] 并且w[i+1][j-1]为回文。如此,我们以位子i为状态,dp[i]表示在i之前的字符最少可以被分为多个子回文串。
dp[i] = min(dp[j-1] + 1) {w[j][i] == true}
求一个字符串最少可以被分为几个回文字串。如aaadbccb 可以被分为aaa d bccb 三个。
n^2预处理出w[i][j],即i到j段是否为回文。为回文的条件为s[i] == s[j] 并且w[i+1][j-1]为回文。如此,我们以位子i为状态,dp[i]表示在i之前的字符最少可以被分为多个子回文串。
dp[i] = min(dp[j-1] + 1) {w[j][i] == true}
[code]#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int INF = 999999999; int n; char s[1010]; int dp[1010]; bool vis[1010][1010]; void init () { for (int j=0; j<n; j++) { for (int i=j; i>=0; i--) { if (i == j) vis[i][j] = true; else if (j-i==1 && s[i] == s[j]) vis[i][j] = true; else if (vis[i+1][j-1] == true && (s[i] == s[j])) vis[i][j] = true; else vis[i][j] = false; } } } int main () { int T; for (scanf ("%d", &T); T>0; T--) { scanf("%s", s); n = strlen(s); init(); dp[0] = 1; for (int i=0; i<n; i++) { if (vis[0][i] == true) dp[i] = 1; else dp[i] = INF; for (int j=0; j<i; j++) { if (vis[j+1][i] == true) dp[i] = min(dp[i], dp[j] + 1); } } printf ("%d\n", dp[n-1]); } return 0; }
相关文章推荐
- 手动查杀skypee病毒(AutoIt3木马)
- 链队列的实现
- poj1035 spell checker (简单的字符串查找题)
- 费用流 poj2195 Going Home
- uva 1610 Party Games
- 2015华为软件精英挑战赛德州扑克之蒙特卡洛法模拟胜率
- iPhone入门开发系列2备忘录APP学习03--table view
- 基于火狐和谷歌浏览器的html5调用摄像头
- hdu5392 Infoplane in Tina Town(LCM)
- ECLIPSE @OVERRIDE报错解决 必须覆盖超类方法
- 零基础学python-3.7 另一个程序 python读写文本
- 如何实现大文件数据上传
- 零基础学python-3.7 另一个程序 python读写文本
- 全国城市行政区划码Json格式
- 零基础学python-3.6 根据模块结构 改进我们的游戏
- 零基础学python-3.6 根据模块结构 改进我们的游戏
- 倒计时的实现
- 零基础学python-3.5 内存管理
- 零基础学python-3.5 内存管理
- [置顶] 我的Android博文整理汇总