Uva 10739

题意:给定字符串,可以增加、删除、修改任意字符,问最少经过多少次操作使字符串回文。

题解:定义dp[l][r]表示把从l到r的子串Sl...Sr变成回文串需要操作的最少次数。字符可以增删改,有的博客说增删是一样的,有的说增比删开销大,我倾向于后者,但前者是对的。因为显然s[l]==s[r]时,dp[l][r]=dp[l+1][r-1];当两者不相等时,可以删去s[l]或者s[r],状态转移到dp[l+1][r]+1或dp[l][r-1]+1,但是增加怎么加?一样的,在状态dp[l][r-1]的左边添加's[l-1]'=s[r],或在状态dp[l+1][r]的右边添加's[r+1]'=s[l],画图看看,这和删除确实一样;自然,也可以把s[l],s[r]修改成相同的,状态转移到dp[l+1][r-1]+1。

直接循环里dp:

  

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; int dp[][];
char s[]; int Min(int a,int b,int c)
{
int t=min(a,b);
return min(t,c);
} int main()
{
int T;
cin>>T;
for(int cas=;cas<=T;cas++)
{
cin>>s;
int len=strlen(s);
for(int i=;i<len;i++) dp[i][i]=;
for(int i=len-;i>=;i--){
for(int j=i+;j<len;j++){
if(s[i]==s[j]) dp[i][j]=dp[i+][j-];
else dp[i][j]=Min(dp[i+][j],dp[i][j-],dp[i+][j-])+;
}
}
cout<<"Case "<<cas<<": "<<dp[][len-]<<endl;
}
return ;
}

或者记忆化搜索(dfs):

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; int dp[][];
char s[]; int dfs(int l,int r)
{
if(dp[l][r]!=-) return dp[l][r];
if(l>=r) return dp[l][r]=;
if(s[l]==s[r])
dp[l][r]=dfs(l+,r-);
else
dp[l][r]=min(dfs(l+,r-),min(dfs(l+,r),dfs(l,r-)))+;
return dp[l][r];
} int main()
{
int T;
cin>>T;
for(int cas=;cas<=T;cas++)
{
cin>>s;
int len=strlen(s);
memset(dp,-,sizeof(dp));
cout<<"Case "<<cas<<": "<<dfs(,len-)<<endl;
}
return ;
}

uva 10739【基础(区间)dp】的更多相关文章

  1. hdu 4597 + uva 10891(一类区间dp)

    题目链接:http://vjudge.net/problem/viewProblem.action?id=19461 思路:一类经典的博弈类区间dp,我们令dp[l][r]表示玩家A从区间[l, r] ...

  2. UVA - 1632 Alibaba (区间dp+常数优化)

    题目链接 设$dp[l][r][p]$为走完区间$[l,r]$,在端点$p$时所需的最短时间($p=0$代表在左端点,$p=1$代表在右端点) 根据题意显然有状态转移方程$\left\{\begin{ ...

  3. UVA 10559 Blocks——区间dp

    题目:https://www.luogu.org/problemnew/show/UVA10559 应该想到区间dp.但怎么设计状态? 因为连续的东西有分值,所以应该记录一下连续的有多少个. 只要记录 ...

  4. CodeForces-607B:Zuma (基础区间DP)

    Genos recently installed the game Zuma on his phone. In Zuma there exists a line of n gemstones, the ...

  5. UVA 10559 Blocks —— 区间DP

    题目:https://www.luogu.org/problemnew/show/UVA10559 区间DP,有点难想: 为了方便,先把原来就是连续一段相同颜色的点看做一个点,记一下长度: f[i][ ...

  6. UVA - 1632 Alibaba 区间dp

    题意:给定n个点,其中第i个点的坐标是,且它会在秒后消失.Alibaba可以从任意位置出发,求访问完所有点的最短时间.无解输出No solution. 思路:表示访问完区间后停留在i点的最短时间,表示 ...

  7. UVA 10559 Blocks(区间DP&&递推)

    题目大意:给你玩一个一维版的消灭星星,得分是当前消去的区间的长度的平方,求最大得分. 现在分析一下题目 因为得分是长度的平方,不能直接累加,所以在计算得分时需要考虑前一个状态所消去的长度,仅用dp[l ...

  8. UVa 1630 Folding (区间DP)

    题意:折叠一个字符串,使得其成为一个尽量短的字符串  例如AAAAAA变成6(A) 而且这个折叠是可以嵌套的,例如 NEEEEERYESYESYESNEEEEERYESYESYES 会变成 2(N5( ...

  9. 区间DP UVA 10739 String to Palindrome

    题目传送门 /* 题意:三种操作,插入,删除,替换,问最少操作数使得字符串变成回文串 区间DP:有一道类似的题,有点不同的是可以替换,那么两端点不同的时候可以替换掉一个后成回文, 即dp[j+1][k ...

随机推荐

  1. 公司jar包提交到集群的方法

    yarn -jar xx.jar 此时包会提交到集群上运行 也可以把jar包放到hbase 的lib下面用hbase jar 方式调用

  2. 2019-9-2-win10-uwp-截图-获取屏幕显示界面保存图片

    title author date CreateTime categories win10 uwp 截图 获取屏幕显示界面保存图片 lindexi 2019-09-02 12:57:38 +0800 ...

  3. Luogu P1948 [USACO08JAN]电话线Telephone Lines(最短路+dp)

    P1948 [USACO08JAN]电话线Telephone Lines 题意 题目描述 Farmer John wants to set up a telephone line at his far ...

  4. Leetcode459.Repeated Substring Pattern重复的子字符串

    给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: 输入: "abab" 输出: True 解释 ...

  5. 微信网页授权demo2

    1.在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名.请注意,这里填写的是 ...

  6. hdu 2586 (lca-RMQ)

    #include <iostream> #include <cstdlib> #include <cstring> #include <queue> # ...

  7. PHP获取搜索引擎关键词

    有时候我们需要知道用户通过哪个搜索引擎,通过拿个关键词访问我们页面,当然js也可以实现,这里介绍下php的实现代码,包含(百度.谷歌.雅虎.搜狗.搜搜.必应.有道)几大搜索引擎的获取方法. //获取来 ...

  8. JS---案例:滚动条

    案例:滚动条 html框架分为4部分,最外面的div, 放文字的div, 装滚动条的div层,以及滚动条本身放在一个div里面 <!DOCTYPE html> <html> & ...

  9. JEECMS二次开发 -------标签使用说明

    转载:https://blog.csdn.net/u012176984/article/details/45501771 一:标签套用结构说明 登录后台管理页面,这些嵌套在html中的标签 以[@标签 ...

  10. http方式nginx 访问不带www的域名301重定向跳转到www的域名帮助seo集中权重

    比如我需要吧gucanhui.com重定向301跳转到www.gucanhui.com 需要在nginx的con发文件中加入一段 server { listen ; server_name gucan ...