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 ...
随机推荐
- JavaScript性能优化:度量、监控与可视化1
HTTP事务所需要的步骤: 接下来,浏览器与远程Web服务器通过TCP三次握手协商来建立一个TCP/IP连接,类似对讲机的Over(完毕) Roger(明白) TCP/IP模型 TCP即传输控制协议( ...
- mac osx App store 安装软件 发生错误
app store 安装软件时发生错误 解决办法: 1. 进入如下目录: sh-3.2# cd Library/Application\ Support/App\ Store/ sh-3.2# pwd ...
- HW5.18
public class Solution { public static void main(String[] args) { System.out.printf("%s\t%s\n&qu ...
- poj 1459 Power Network【建立超级源点,超级汇点】
Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 25514 Accepted: 13287 D ...
- Mozilla NPAPI开发示例之一(VS2012 + Win7(64位))
入门级的NPAPI开发. NPAPI & NPRuntime 简介 Netscape Plugin Application Programming Interface (NPAPI) NPAP ...
- 多目标遗传算法 ------ NSGA-II (部分源码解析) 非支配排序、分层 rank.c
/* Rank assignment routine */ # include <stdio.h> # include <stdlib.h> # include <mat ...
- MySQL安装配置,命令,异常纪要
一.Mac上的安装配置 // brew安装 brew install mysql // 设置为开机启动 brew services start mysql ...
- spring + springmvc + jdbc + quartz + maven整合
个人搭建框架: pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="htt ...
- ThinkPHP3.1新特性: 多层MVC支持
ThinkPHP基于MVC(Model-View-Controller,模型-视图-控制器)模式,不过均支持多层(multi-Layer)设计. 模型(Model)层:默认的模型层由Model类构成, ...
- Cocos-2d 坐标系及其坐标转换
Cocos-2d中,涉及到4种坐标系: GL坐标系Cocos2D以OpenglES为图形库,所以它使用OpenglES坐标系.GL坐标系原点在屏幕左下角,x轴向右,y轴向上. 屏幕坐标系苹果的Quar ...