• 题目
  • 做法

好题啊.

题目

lightoj 1044 Palindrome Partitioning
给出一个字符串,求最少把它分成多少个回文串.

做法

要求的时间复杂度是O(n2)O(n2)O(n^2)或者O(n3)O(n3)O(n^3).
我们先来看一下O(n3)O(n3)O(n^3)的.

/*
考虑dp.dp[i]表示到第i个字符为止至少分成多少个回文串.
显然如果[r,i]是一个回文串,则dp[i]可以通过dp[r-1]+1转移过来,即加上这一个回文串.
那么每一次暴力判断[r,i]是否是回文串,176ms通过此题.
*/
#include<bits/stdc++.h> //Ithea Myse Valgulious
namespace chtholly{
typedef long long ll;
#define re0 register int
#define rec register char
#define rel register ll
#define gc getchar
#define pc putchar
#define p32 pc(' ')
#define pl puts("")
/*By Citrus*/
inline int read(){int x=0,f=1;char c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0');return f?x:-x;}
template <typename mitsuha>
inline bool read(mitsuha &x){x=0;int f=1;char c=gc();for (;!isdigit(c)&&~c;c=gc()) f^=c=='-';if (!~c) return 0;for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0');return x=f?x:-x,1;}
template <typename mitsuha>
inline int write(mitsuha x){if (!x) return 0&pc(48);if (x<0) x=-x,pc('-');int bit[20],i,p=0;for (;x;x/=10) bit[++p]=x%10;for (i=p;i;--i) pc(bit[i]+48);return 0;}
inline char fuhao(){char c=gc();for (;isspace(c);c=gc());return c;}
}using namespace chtholly;
using namespace std;
const int inf=0x3f3f3f3f;
char c[1010];
int dp[1010];bool judge(int l,int r){
for (;l<=r;++l,--r) if (c[l]^c[r]) return 0;return 1;
}int main(){
for (int t=read(),llx=0;t--;){scanf("%s",c);int n=strlen(c);for (int i=0;i<n;++i){dp[i]=inf;for (int j=0;j<=i;++j){if (judge(j,i)){dp[i]=!j?1:min(dp[i],dp[j-1]+1); }    } }printf("Case %d: ",++llx);write(dp[n-1]),pl;}
}

接下来我们考虑优化.
如果预先用n2n2n^2的复杂度处理出每一个[l,r][l,r][l,r]是否是回文串,那就可以优化成功了.

/*
如果[l,r]是回文串并且s[l-1]=s[r+1],则[l-1,r+1]也必然是回文串.
利用这个性质,我们可以以每一个字符或者连续的两个字符为中心扩散开去,把所有的回文串跑出来.
代码如下.
结果并没有优化多少时间(144ms),果然是评测机的效率的原因.
*/
#include<bits/stdc++.h> //Ithea Myse Valgulious
namespace chtholly{
typedef long long ll;
#define re0 register int
#define rec register char
#define rel register ll
#define gc getchar
#define pc putchar
#define p32 pc(' ')
#define pl puts("")
/*By Citrus*/
inline int read(){int x=0,f=1;char c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0');return f?x:-x;}
template <typename mitsuha>
inline bool read(mitsuha &x){x=0;int f=1;char c=gc();for (;!isdigit(c)&&~c;c=gc()) f^=c=='-';if (!~c) return 0;for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0');return x=f?x:-x,1;}
template <typename mitsuha>
inline int write(mitsuha x){if (!x) return 0&pc(48);if (x<0) x=-x,pc('-');int bit[20],i,p=0;for (;x;x/=10) bit[++p]=x%10;for (i=p;i;--i) pc(bit[i]+48);return 0;}
inline char fuhao(){char c=gc();for (;isspace(c);c=gc());return c;}
}using namespace chtholly;
using namespace std;
const int inf=0x3f3f3f3f;
char c[1010];
int dp[1010],is[1010][1010];int main(){
for (int t=read(),llx=0;t--;){scanf("%s",c);int n=strlen(c);memset(is,0,sizeof is);for (int i=0;i<n;++i){for (int l=i,r=i;l>=0&&r<n;--l,++r){//以i为中心过去.if (c[l]==c[r]) is[l][r]=1;else break;}for (int l=i,r=i+1;l>=0&&r<n;--l,++r){//以i,i+1两个字符为中心扩散过去.if (c[l]==c[r]) is[l][r]=1;else break;}}for (int i=0;i<n;++i){dp[i]=inf;for (int j=0;j<=i;++j){if (is[j][i]){dp[i]=!j?1:min(dp[i],dp[j-1]+1); }    } }printf("Case %d: ",++llx);write(dp[n-1]),pl;}
}

谢谢大家.

回文串分割:经典dp相关推荐

  1. LeetCode 1745. 回文串分割 IV(区间DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,那么返回 true ,否则返回 false . 当一个字符串正着读和反着读是一模一样的, ...

  2. LeetCode 132. 分割回文串 II(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: ...

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

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

  4. leetcode132. 分割回文串 II(dp)

    给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文. 返回符合要求的 最少分割次数 . 示例 1: 输入:s = "aab" 输出:1 解释:只需一次分割就可将 s ...

  5. 132. 分割回文串 II

    链接:132. 分割回文串 II 题解:https://leetcode-cn.com/problems/palindrome-partitioning-ii/solution/xiang-tong- ...

  6. LeetCode 1278. 分割回文串 III

    截止到目前我已经写了 600多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载 下载链接:https://pan.baidu.com/s/1hj ...

  7. 怎么判断一个字符串的最长回文子串是否在头尾_LeetCode 第 131 号问题:分割回文串...

    题目来源于 LeetCode 上第 131 号问题:分割回文串.题目难度为 Medium,目前通过率为 45.8% . 题目描述 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返 ...

  8. 【回溯法】python 实现 全排列,子集,组合问题、分割回文串

    leetcode39.40.47. 78. 77.131 目录 47:全排列 78:子集 39组合总和 40 组合总和 77组合 131 分割回文串 47:全排列 全排列问题:  使用回溯法,需要注意 ...

  9. AK F.*ing leetcode 流浪计划之回文串

    欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击. 文章目录 一.简介 二.解题步骤 三.作用 四.经典算法介绍 判断一个串是否为回文串(单次查询) 普通情况 判断指定字符 多次子 ...

最新文章

  1. jndi mysql数据库_数据库连接池技术中dbcp、c3p0、jndi
  2. git push 提交时显示 Empty reply from server的解决办法
  3. 计算机检索基础知识,[转载]四 计算机文献检索基础知识(原理、结构和功能)...
  4. 3d 自动生成物体_根据 2D 图片自动生成 3D 图书封面的牛逼工具
  5. 2019年伯克利大学 CS294-112《深度强化学习》第4讲:强化学习简介(笔记)
  6. 利用Photoshop制作二寸照片
  7. Java实战项目-移动电商秒杀系统Seckill总结
  8. python是一门跨平台语言_python属于跨平台语言码
  9. 移动端判断手机横竖屏状态及加载相应样式或内容的解决方案
  10. Unity做动画不播放解决方案之一
  11. 三维交互可视化平台(智慧海上牧场平台)学习开发Flask+Vue+Echarts+Mysql+websocket 实战(四)
  12. Unity3D-设置天空盒
  13. 《推荐算法工程师培养计划》
  14. After all, tomorrow is another day
  15. Curses函数说明(SCO)
  16. html 转pdf 之wkhtmltopdf
  17. 《那些年啊,那些事——一个程序员的奋斗史》——05
  18. 数据泄露典型判例分析报告
  19. python matplotlib函数_python matplotlib 绘制三次函数图像
  20. 【ML4CO论文精读】用于组合优化的机器学习:方法论之旅(Yoshua Bengio, 2021)

热门文章

  1. 90后00后用户很难抓住,腾讯有什么“逆生长”绝招吗?
  2. mysql(版本5.7)(操作数据库 操作表结构 操作表记录)
  3. Go Web之Gin框架 启动程序之后程序直接停止的问题解决
  4. python怎么重复输入密码直至正确_python作业/练习/实战:生成随机密码
  5. 五行代码实现 炫动滑动 卡片层叠布局,仿探探、人人影视订阅界面 简单优雅
  6. 企业机器学习后来居上,吃螃蟹者引领前行?
  7. [官方]江民就传闻从卡巴斯基网站秘获病毒资料的声明
  8. 计算机网络基础---网络层
  9. McAfee VirusScan v8.7官方版
  10. python爬虫爬图片教程_Python爬虫爬图片需要什么