回文串分割:经典dp
- 题目
- 做法
好题啊.
题目
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相关推荐
- LeetCode 1745. 回文串分割 IV(区间DP)
文章目录 1. 题目 2. 解题 1. 题目 给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,那么返回 true ,否则返回 false . 当一个字符串正着读和反着读是一模一样的, ...
- LeetCode 132. 分割回文串 II(DP)
文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: ...
- UVA - 11584 Partitioning by Palindromes(划分成回文串)(dp)
题意:输入一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串,字符串长度不超过1000. 分析: 1.dp[i]为字符0~i划分成的最小回文串的个数. 2.dp[j] = Min(dp[j ...
- leetcode132. 分割回文串 II(dp)
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文. 返回符合要求的 最少分割次数 . 示例 1: 输入:s = "aab" 输出:1 解释:只需一次分割就可将 s ...
- 132. 分割回文串 II
链接:132. 分割回文串 II 题解:https://leetcode-cn.com/problems/palindrome-partitioning-ii/solution/xiang-tong- ...
- LeetCode 1278. 分割回文串 III
截止到目前我已经写了 600多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载 下载链接:https://pan.baidu.com/s/1hj ...
- 怎么判断一个字符串的最长回文子串是否在头尾_LeetCode 第 131 号问题:分割回文串...
题目来源于 LeetCode 上第 131 号问题:分割回文串.题目难度为 Medium,目前通过率为 45.8% . 题目描述 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返 ...
- 【回溯法】python 实现 全排列,子集,组合问题、分割回文串
leetcode39.40.47. 78. 77.131 目录 47:全排列 78:子集 39组合总和 40 组合总和 77组合 131 分割回文串 47:全排列 全排列问题: 使用回溯法,需要注意 ...
- AK F.*ing leetcode 流浪计划之回文串
欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击. 文章目录 一.简介 二.解题步骤 三.作用 四.经典算法介绍 判断一个串是否为回文串(单次查询) 普通情况 判断指定字符 多次子 ...
最新文章
- jndi mysql数据库_数据库连接池技术中dbcp、c3p0、jndi
- git push 提交时显示 Empty reply from server的解决办法
- 计算机检索基础知识,[转载]四 计算机文献检索基础知识(原理、结构和功能)...
- 3d 自动生成物体_根据 2D 图片自动生成 3D 图书封面的牛逼工具
- 2019年伯克利大学 CS294-112《深度强化学习》第4讲:强化学习简介(笔记)
- 利用Photoshop制作二寸照片
- Java实战项目-移动电商秒杀系统Seckill总结
- python是一门跨平台语言_python属于跨平台语言码
- 移动端判断手机横竖屏状态及加载相应样式或内容的解决方案
- Unity做动画不播放解决方案之一
- 三维交互可视化平台(智慧海上牧场平台)学习开发Flask+Vue+Echarts+Mysql+websocket 实战(四)
- Unity3D-设置天空盒
- 《推荐算法工程师培养计划》
- After all, tomorrow is another day
- Curses函数说明(SCO)
- html 转pdf 之wkhtmltopdf
- 《那些年啊,那些事——一个程序员的奋斗史》——05
- 数据泄露典型判例分析报告
- python matplotlib函数_python matplotlib 绘制三次函数图像
- 【ML4CO论文精读】用于组合优化的机器学习:方法论之旅(Yoshua Bengio, 2021)
热门文章
- 90后00后用户很难抓住,腾讯有什么“逆生长”绝招吗?
- mysql(版本5.7)(操作数据库 操作表结构 操作表记录)
- Go Web之Gin框架 启动程序之后程序直接停止的问题解决
- python怎么重复输入密码直至正确_python作业/练习/实战:生成随机密码
- 五行代码实现 炫动滑动 卡片层叠布局,仿探探、人人影视订阅界面 简单优雅
- 企业机器学习后来居上,吃螃蟹者引领前行?
- [官方]江民就传闻从卡巴斯基网站秘获病毒资料的声明
- 计算机网络基础---网络层
- McAfee VirusScan v8.7官方版
- python爬虫爬图片教程_Python爬虫爬图片需要什么