UVA 10739 String to Palindrome(动态规划 回文)
String to Palindrome
题目大意:给出一个字符串s,现在可以进行3种操作(添加字母,删除字母,替换字母),将其变成回文串,求出最少的操作次数。比如abccda,可以用删除操作,删除b,d两步可变成回文;但如果用替换操作,把b换成d则只需要1步。
分析:刚开始我一直考虑它是否具有最优子结构性质,直到现在,还是不明白为什么可以用动态规划来做,大神若是看见,还望指教。
由于添加字母和删除字母的效果是一样的,因此我们这里就只进行删除和替换操作。令dp[i][j]表示从第 i 到第 j 个字母变成回文所需要最少的操作数。
转移方程为:当是s[i]==s[j]时,dp[i][j] = dp[i+1][j-1];此外dp[i][j] = min(dp[i+1][j],dp[i+1][j-1],dp[i][j-1]) + 1; dp[i+1][j-1]+1 是替换操作,其他两种是删除操作。
初始条件是:j<=i 时dp[i][j] = 0; 如果只是单一的字母,它本身就是回文
递推代码如下:
# include<cstdio>
# include<cstring>
# include<iostream>
using namespace std;
char s[];
int dp[][];
int main()
{
int T,cas;
scanf("%d",&T);
for(cas=; cas<=T; cas++)
{
scanf("%s",s);
int len =strlen(s);
int i,j;
for(i=; i<len; i++)
dp[i][i] = ;
for(i=len-; i>=; i--)
for(j=i+; j<len; j++)
{
if(s[i]==s[j])
dp[i][j] = dp[i+][j-];
else
dp[i][j] = min(min(dp[i+][j],dp[i+][j-]),dp[i][j-])+;
}
printf("Case %d: %d\n",cas,dp[][len-]);
}
return ;
}
递归代码如下:
# include<cstdio>
# include<cstring>
# include<iostream>
using namespace std;
char s[];
int dp[][];
int DP(int x,int y){
if(dp[x][y] != -)
return dp[x][y];
if(y <= x )
return dp[x][y] = ;
if(s[x] == s[y])
dp[x][y] = DP(x+,y-);
else
dp[x][y] = min( min(DP(x+,y),DP(x+,y-)),(DP(x,y-))) + ;
return dp[x][y];
}
int main(){
int T,cas;
scanf("%d",&T);
for(cas=;cas<=T;cas++){
scanf("%s",s);
int len =strlen(s);
memset(dp,-,sizeof(dp));
printf("Case %d: %d\n",cas,DP(,len-));
}
return ;
}
UVA 10739 String to Palindrome(动态规划 回文)的更多相关文章
- 区间DP UVA 10739 String to Palindrome
题目传送门 /* 题意:三种操作,插入,删除,替换,问最少操作数使得字符串变成回文串 区间DP:有一道类似的题,有点不同的是可以替换,那么两端点不同的时候可以替换掉一个后成回文, 即dp[j+1][k ...
- UVA 10739 String to Palindrome(dp)
Problem H String to Palindrome Input: Standard Input Output: Standard Output Time Limit: 1 Second In ...
- [LeetCode] Valid Palindrome 验证回文字符串
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...
- LeetCode Valid Palindrome 有效回文(字符串)
class Solution { public: bool isPalindrome(string s) { if(s=="") return true; ) return tru ...
- CF932G Palindrome Partition(回文自动机)
CF932G Palindrome Partition(回文自动机) Luogu 题解时间 首先将字符串 $ s[1...n] $ 变成 $ s[1]s[n]s[2]s[n-1]... $ 就变成了求 ...
- Codeforces 932G Palindrome Partition - 回文树 - 动态规划
题目传送门 通往???的传送点 通往神秘地带的传送点 通往未知地带的传送点 题目大意 给定一个串$s$,要求将$s$划分为$t_{1}t_{2}\cdots t_{k}$,其中$2\mid k$,且$ ...
- UVa 12050 - Palindrome Numbers (回文数)
A palindrome is a word, number, or phrase that reads the same forwards as backwards. For example, th ...
- UVA 11584 Paritioning by Palindromes(动态规划 回文)
题目大意:输入一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串.比如racecar本身就是回文串:fastcar只能分成7个单字母的回文串:aaadbccb最少可分成3个回文串:aaa. ...
- Palindrome Numbers UVA - 12050(第几个回文数)
长度为k的回文串个数有9*10^(k-1) #include <iostream> #include <cstdio> #include <sstream> #in ...
随机推荐
- Android ListView 全面优化
结合昨天学习的多线程,今天又继续对ListView进行了优化,包括异步加载图片,滑动时暂停加载,滑动停止后再加载显示界面中的item. 综合ListView在使用时参考的多篇博客,这里对ListVie ...
- [Locked] Range Sum Query 2D - Mutable
Range Sum Query 2D - Mutable Given a 2D matrix matrix, find the sum of the elements inside the recta ...
- Rediss_基本介绍
Redis是典型的NoSQL数据库( Not Only SQL) NoSQL数据库: NoSQL,泛指非关系型的数据库.随着互联网web2.0网站的兴起, 传统的关系数据库在应付web2.0网站, 特 ...
- linq to sql 博客集锦
Linq to sql 比较全面的学习博客 http://www.cnblogs.com/aehyok/tag/Linq%20To%20Sql/ 使用LINQ TO SQL基于Respository ...
- 微信中QQ表情的解析(php)
微信公众平台接受的消息中,标签是用'/:'开头的字符串表示的,假设要在网页上显示(比方制作微信大屏幕),就须要进行转换. 所以我向微信公众平台按顺序发送了各个QQ表情,在微信公众平台后台能够看到接受的 ...
- jQuery Mobile方向感应事件
在现在的智能手机中,都有对方向变换的自动感知功能,比如当手机方向从水平方向切换到垂直方向时,则会触发该事件.在jQuery Mobile中,可以通过orientationchange事件进行绑定,并且 ...
- 密钥,密钥对,公钥,pfx,jks和https的几个概念
密钥: 我理解是公钥+私钥的统称. 密钥对: 公钥(证书)和私钥成对存在. 通信双方各持有自己的私钥和对方的公钥.自己的私钥需密切保护,而公钥是公开给对方的.在windows下,单独存在的公钥一般是后 ...
- 【转】C++里定义全局变量和函数常用方法
http://blog.csdn.net/niying/article/details/637084 1:在头文件是声明变量,然后在使用的文件中用exten标识. ".h": in ...
- iOS 推送,当接到推送消息时如何处理?
接收到通知时有两种进入的方式:1.当app未运行时(BOOL)application:(UIApplication *)application didFinishLaunchingWithOption ...
- Android(java)学习笔记143:android提供打开各种文件的API接口:setDataAndType
android 打开各种文件(setDataAndType) private void openFile(File file){ Intent intent = new Intent(); inten ...