题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2631

题目大意:

给一个字符串, 要求把它分割成若干个子串,使得每个子串都是回文串。问最少可以分割成多少个。

分析:

f[i]表示以i结尾的串最少可以分割的串数。

f[i] = min{ f[j]+1, 串[j,i]是回文串&&1<=j<=i }

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <vector>
 6 #include <cstdlib>
 7 #include <iomanip>
 8 #include <cmath>
 9 #include <ctime>
10 #include <map>
11 #include <set>
12 #include <queue>
13 using namespace std;
14 #define lowbit(x) (x&(-x))
15 #define max(x,y) (x>y?x:y)
16 #define min(x,y) (x<y?x:y)
17 #define MAX 100000000000000000
18 #define MOD 1000000007
19 #define pi acos(-1.0)
20 #define ei exp(1)
21 #define PI 3.141592653589793238462
22 #define INF 0x3f3f3f3f3f
23 #define mem(a) (memset(a,0,sizeof(a)))
24 typedef long long ll;
25 ll gcd(ll a,ll b){
26     return b?gcd(b,a%b):a;
27 }
28 bool cmp(int x,int y)
29 {
30     return x>y;
31 }
32 const int N=10005;
33 const int mod=1e9+7;
34 char str[N];
35 int f[N];
36 bool isPalind(int l, int r){
37     while(l<r){
38         if(str[l]!=str[r]) return false;
39         ++l;
40         --r;
41     }
42     return true;
43 }
44 int main(){
45     int t;
46     scanf("%d",&t);
47     while(t--){
48         scanf("%s",str+1);
49         int len=strlen(str+1);
50         mem(f);
51         for(int i=1;i<=len;i++){
52             f[i]=i+1;
53             for(int j=1;j<=i;j++)
54                 if(isPalind(j,i))
55                 f[i]=min(f[i],f[j-1]+1);
56         }
57         printf("%d\n",f[len]);
58     }
59     return 0;
60 }

转载于:https://www.cnblogs.com/shixinzei/p/7280710.html

UVA 11584 Partitioning by Palindromes (字符串区间dp)相关推荐

  1. UVA - 11584 Partitioning by Palindromes(划分成回文串)(dp)

    题意:输入一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串,字符串长度不超过1000. 分析: 1.dp[i]为字符0~i划分成的最小回文串的个数. 2.dp[j] = Min(dp[j ...

  2. uva 11584——Partitioning by Palindromes

    题意:给定一个字符串,把该字符串划分为最少的回文串. 思路:dp,到达i点的回文串长度都存起来,那么dp[i]=min(以i为结尾的最短的回文串长度). code: #include <bits ...

  3. UVA 11584 Partitioning by Palindromes 动态规划 入门

    这个题目的大意就是,给你一个字符串,然后让你求出最少的回文数.我开始傻逼了,写了一个o(n^3)的算法,结果老超时.然后略看了别人的题解,才知道有个如此的转移方程. f[i+1]=min(f[j]+1 ...

  4. UVA 11584—— Partitioning by Palindromes

    题意:给定一个串,然后问最少可以分割成多少个回文串. 思路:简单dp,dp[i]=min(dp[j]+1,1<j<=i),两次循环扫一遍即可,考察dp的思想. code: #include ...

  5. UVA11584 划分成回文串 Partitioning by Palindromes(线性DP划分+DP判断回文串)

    整理的算法模板合集: ACM模板 依旧是线性DP 我们使用闫氏DP分析法 总体DP转移的时间复杂度为O(n2)O(n^2)O(n2). 但是这里牵扯到判断 i\tt ii 到 j\tt jj 是否为回 ...

  6. 【CodeForces - 245H 】Queries for Number of Palindromes (带容斥的区间dp)

    题干: You've got a string s = s1s2... s|s| of length |s|, consisting of lowercase English letters. The ...

  7. hdu 4632 子字符串统计的区间dp

    题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. 简单的区间dp,哎,以为很神奇的东西,其实也是dp,只是参数改为区间,没做过此类型的题,想不到用dp,以后就 知道了,若已经知道[ ...

  8. lightoj 1044 - Palindrome Partitioning(需要优化的区间dp)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1044 题意:求给出的字符串最少能分成多少串回文串. 一般会想到用区间dp暴力3个for ...

  9. LA 4394 刷字符串(区间dp)

    题意:给定两个长度相等,只有小写字母组成字符串A和B,每步可以把A的一个连续子串刷成同一个字母,问至少需要多少步才能把A变成B. 分析:区间DP,区间DP的套路就是 d[i][j]的在区间 (i,j) ...

最新文章

  1. 为什么你总办不到大额信用卡?
  2. 操作对象_有进取心的机器人学习对象操作的基本原理
  3. Python基本的数据结构-序列
  4. 使用这6个技巧来物理保护 MacBook
  5. Filter的敏感词汇过滤案例
  6. Oracle数据库索引原理分析
  7. 实施数据驱动的供应链管理能力问题
  8. windows下向GitHub上传代码
  9. python好学吗-非科班出身自学Python好学吗?
  10. DLL中无法定位程序输入点inflateReset2于动态链接库
  11. 520送男朋友什么礼物比较好、520给男朋友的实用性礼物
  12. 像素与照片尺寸、分辨率之间的关系
  13. ME51N 创建采购申请
  14. 相传国际象棋是古印度舍罕王的宰相达依尔发明的.舍罕王十分喜爱象棋,决定让宰相自己选择何种赏赐.这位聪明的宰相指着8*8共64格的象棋说:陛下,请您赏给我一些麦子吧.就在棋盘的第1格放1粒,第2格放2粒
  15. MongoDB_实战部分(二)
  16. IOS应用开发调研报告
  17. elf中的bss data
  18. 读计算机专业选北大还是清华,想要学“计算机专业”要选好学校,除了清华北大,这7所也很好...
  19. 定时自动关机命令超级大全
  20. window纯净系统下载地址

热门文章

  1. 通货膨胀时是否提前还本付息--郎咸平
  2. leetcode —— 面试题 16.19. 水域大小
  3. leetcode - 22. 括号生成
  4. 识别和追踪主题层次的影响力者(来自2018 Machine Learning 论文学习笔记)
  5. 高效的Java集合框架GNU Trove的使用
  6. 网络爬虫中URLConnection的使用[以科学网为例]
  7. python中pip的安装与使用
  8. windows下搭建基于nginx的rtmp服务器
  9. Ubuntu解决sudo source command not found错误
  10. Cppcheck 1 54 C/C++静态代码分析工具