POJ 3280 Cheapest Palindrome (区间DP) 经典

时间:2021-07-08 02:45:43

<题目链接>

题目大意:

一个由小写字母组成的字符串,给出字符的种类,以及字符串的长度,再给出添加每个字符和删除每个字符的代价,问你要使这个字符串变成回文串的最小代价。

解题分析:

一道区间DP的好题。因为本题字符串的长度最大为2e3,所以考虑$O(n^2)$直接枚举区间的两个端点,然后对枚举的区间进行状态转移,大体上有三种转移情况:

$dp[l][r]$表示$[l,r]$为回文串的最小代价

对于区间$[l,r]$,当$str[l]==str[r]$时,$dp[l][r]=dp[l+1][r-1]$

对于$dp[l+1][r]$情况,即$[l+1,r]$为回文串,$dp[l][r]=dp[l+1][r]+min($在$r+1$添加$str[l]$,在$l$删除$str[l])$的代价

对于$dp[l][r-1]$的情况,即$[l,r-1]$为回文串,$dp[l][r]=dp[l][r-1]+min($在$l-1$添加$str[r]$,在$r$删除$str[r])$的代价

记忆化搜索

#include <iostream>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std; const int N = 2e3+;
int n,m,dp[N][N],add[],del[];
char str[N]; int DP(int l,int r){
if(l>=r)return ;
if(dp[l][r]!=-)return dp[l][r];
dp[l][r]=1e9;
if(str[l]==str[r])dp[l][r]=DP(l+,r-);
dp[l][r]=min(dp[l][r],DP(l+,r)+min(add[str[l]-'a'],del[str[l]-'a']));
dp[l][r]=min(dp[l][r],DP(l,r-)+min(add[str[r]-'a'],del[str[r]-'a']));
return dp[l][r];
} int main(){
scanf("%d%d",&n,&m);
scanf("%s",str+);
for(int i=;i<=n;i++){
char c;cin>>c;
int pos=c-'a';
scanf("%d%d",&add[pos],&del[pos]);
}
memset(dp,-,sizeof(dp));
printf("%d\n",DP(,m));
}

递推DP

#include <iostream>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std; const int N = 2e3+;
int n,m,dp[N][N],add[],del[];
char str[N]; int main(){
scanf("%d%d",&n,&m);
scanf("%s",str+);
for(int i=;i<=n;i++){
char c;cin>>c;
int pos=c-'a';
scanf("%d%d",&add[pos],&del[pos]);
}
//memset(dp,0x3f,sizeof(dp)); //因为下面的[i+1,j-1]可能会出现j<i的情况,所以不能这样初始化为无穷
for(int i=m;i>=;i--){
dp[i][i]=;
for(int j=i+;j<=m;j++){
dp[i][j]=1e9;
if(str[i]==str[j])dp[i][j]=dp[i+][j-];
dp[i][j]=min(dp[i][j],dp[i+][j]+min(add[str[i]-'a'],del[str[i]-'a']));
dp[i][j]=min(dp[i][j],dp[i][j-]+min(add[str[j]-'a'],del[str[j]-'a']));
}
}
cout<<dp[][m]<<endl;
}

POJ 3280 Cheapest Palindrome (区间DP) 经典的更多相关文章

  1. POJ 3280 Cheapest Palindrome &lpar; 区间DP &amp&semi;&amp&semi; 经典模型 &rpar;

    题意 : 给出一个由 n 中字母组成的长度为 m 的串,给出 n 种字母添加和删除花费的代价,求让给出的串变成回文串的代价. 分析 :  原始模型 ==> 题意和本题差不多,有添和删但是并无代价 ...

  2. POJ 3280 - Cheapest Palindrome - &lbrack;区间DP&rsqb;

    题目链接:http://poj.org/problem?id=3280 Time Limit: 2000MS Memory Limit: 65536K Description Keeping trac ...

  3. POJ 3280 Cheapest Palindrome(DP 回文变形)

    题目链接:http://poj.org/problem?id=3280 题目大意:给定一个字符串,可以删除增加,每个操作都有代价,求出将字符串转换成回文串的最小代价 Sample Input 3 4 ...

  4. &lpar;中等&rpar; POJ 3280 Cheapest Palindrome,DP。

    Description Keeping track of all the cows can be a tricky task so Farmer John has installed a system ...

  5. POJ 3280 Cheapest Palindrome【DP】

    题意:对一个字符串进行插入删除等操作使其变成一个回文串,但是对于每个字符的操作消耗是不同的.求最小消耗. 思路: 我们定义dp [ i ] [ j ] 为区间 i 到 j 变成回文的最小代价.那么对于 ...

  6. POJ 3280 Cheapest Palindrome(DP)

    题目链接 题意 :给你一个字符串,让你删除或添加某些字母让这个字符串变成回文串,删除或添加某个字母要付出相应的代价,问你变成回文所需要的最小的代价是多少. 思路 :DP[i][j]代表的是 i 到 j ...

  7. POJ 3280 Cheapest Palindrome 简单DP

    观察题目我们可以知道,实际上对于一个字母,你在串中删除或者添加本质上一样的,因为既然你添加是为了让其对称,说明有一个孤立的字母没有配对的,也就可以删掉,也能满足对称. 故两种操作看成一种,只需要保留花 ...

  8. POJ 3280 Cheapest Palindrome (DP)

     Description Keeping track of all the cows can be a tricky task so Farmer John has installed a sys ...

  9. POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)

    题目链接:http://poj.org/problem?id=3280 题目大意:给你一个字符串,你可以删除或者增加任意字符,对应有相应的花费,让你通过这些操作使得字符串变为回文串,求最小花费.解题思 ...

随机推荐

  1. Conditional Split component 用法

    Conditional Split 用于将数据流按照条件进行拆分,每一个output 都有name和condition. 数据流逐行按照condition进行match,如果match,那么改行会进入 ...

  2. Codeforces 749B:Parallelogram is Back(计算几何)

    http://codeforces.com/problemset/problem/749/B 题意:已知平行四边形三个顶点,求另外一个顶点可能的位置. 思路:用向量来做. #include <c ...

  3. c&plus;&plus; primer复习(三)

    1 istream.ostream类型,cin.cout.cerr是istream或ostream类型的具体的对象,<<和>>是操纵符 getline函数的参数是istream ...

  4. 关于MEF

    MEF(Managed Extensibility Framework)是.NET Framework 4.0一个重要的库,Visual Studio 2010 Code Editor的扩展支持也是基 ...

  5. &lbrack;Phonegap&plus;Sencha Touch&rsqb; 移动开发24 打包wp8&period;1的App,执行时输入框聚焦弹出软键盘之后,界面上移而不恢复原位的解决的方法

    这个现象仅仅出如今phonegap打包sencha touch的wp8.1程序会出现(仅wp8.1,wp8正常),其他js框架我測试了几个(app framework, jquery mobile), ...

  6. 递推、数位DP解析(以HDU 2089 和 HDU 3555 为例)

    HDU 2089 不要62 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2089 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人 ...

  7. CTF学习资料总结

    网络攻防大作业学习方向思路 一直对CTF比赛有参与的兴趣,但由于课程比较多,一直没有足够的时间系统的去了解与训练.所以我想利用接下来的几周时间对CTF比赛经行练习.并找到自己所擅长或感兴趣的方向深入研 ...

  8. SDUT OJ 顺序表应用1:多余元素删除之移位算法

    顺序表应用1:多余元素删除之移位算法 Time Limit: 1000 ms Memory Limit: 650 KiB Submit Statistic Discuss Problem Descri ...

  9. MicroMessage的动态操作(第二步)

    现在开始将静态页面转化成动态页面.将页面上的信息转化成 数据库提供的信息. 建立jdbc获取数据库连接,并设置一个查询sql语句,查出所有结果.但是因为查询结果rs包含全表信息,是多行. 为了保存查询 ...

  10. gitlab利用ssh方式拉取代码

    问题1: Bad owner or permissions on .ssh/config的解决 当为本机配一个固定用户名远程登录某主机时,配置了一个config文件,但是在执行ssh免密码登录时报如下 ...