<题目链接>

题目大意:

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

解题分析:

一道区间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 ( 区间DP && 经典模型 )

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

  2. POJ 3280 - Cheapest Palindrome - [区间DP]

    题目链接: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. (中等) 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. nginx的location配置root、alias用法和区别

    root & alias区别root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上root的处理结果是:root路径 ...

  2. ComboBox下拉列表框

    属性:DropDownStyle(下拉.可编辑等).Items(条目) 事件:SelectedIndexChanged选择项改变触发 Items内容:总经理.副总经理.财务部 DropDownStyl ...

  3. 纯js Ajax 请求

    var XMLHttpReq; function createXMLHttpRequest() { if(window.ActiveXObject ) { try { XMLHttpReq = new ...

  4. JGUI源码:鼠标中键滚动再次优化(5)

    //电脑端中键滚动事件 var mousewheel = getBrowserInfo() == "Firefox" ? "DOMMouseScroll" : ...

  5. struts2简单入门-OGNL表达式

    什么是OGNL表达式 Object-Graph Navigation Language的缩写. 可以遍历整个对象结构图,实现对象类型转换等功能的表达式. OGNL实际上是个Map集合,有一个上下文根对 ...

  6. ES6走一波 数组的扩展

    Array flat 数组实例的扁平化方法(浏览器支持不佳) 建议使用 lodash的 flatten

  7. Centos7 安装 scrapy

    Centos7 安装 scrapy ( *:此python版本为 2.7 ) 1.先安装 python (2.7) 在安装 scrapy 要先安装 python 和 pip,  链接:https:// ...

  8. mybatis LIKE动态参数 sql语句

    @Select({ "select id, vedio_name, vedio_path,vedio_duration, vedio_classify_id, crt_user_id, cr ...

  9. PCA,到底在做什么

    很久以前写过一篇 PCA 的小白教程,不过由于当时对 PCA 的理解流于表面,所以只是介绍了一下 PCA 的算法流程.今天在数图课上偶然听到 PCA 在图像压缩上的应用,突然明白了一点实质性的东西,这 ...

  10. PageUtil.java分页工具类

    package com.chabansheng.util; /** * 分页工具类 * @author Administrator * */ public class PageUtil { /** * ...