POJ 3280 Cheapest Palindrome (区间DP) 经典
<题目链接>
题目大意:
一个由小写字母组成的字符串,给出字符的种类,以及字符串的长度,再给出添加每个字符和删除每个字符的代价,问你要使这个字符串变成回文串的最小代价。
解题分析:
一道区间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) 经典的更多相关文章
- POJ 3280 Cheapest Palindrome ( 区间DP && 经典模型 )
题意 : 给出一个由 n 中字母组成的长度为 m 的串,给出 n 种字母添加和删除花费的代价,求让给出的串变成回文串的代价. 分析 : 原始模型 ==> 题意和本题差不多,有添和删但是并无代价 ...
- POJ 3280 - Cheapest Palindrome - [区间DP]
题目链接:http://poj.org/problem?id=3280 Time Limit: 2000MS Memory Limit: 65536K Description Keeping trac ...
- POJ 3280 Cheapest Palindrome(DP 回文变形)
题目链接:http://poj.org/problem?id=3280 题目大意:给定一个字符串,可以删除增加,每个操作都有代价,求出将字符串转换成回文串的最小代价 Sample Input 3 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 ...
- POJ 3280 Cheapest Palindrome【DP】
题意:对一个字符串进行插入删除等操作使其变成一个回文串,但是对于每个字符的操作消耗是不同的.求最小消耗. 思路: 我们定义dp [ i ] [ j ] 为区间 i 到 j 变成回文的最小代价.那么对于 ...
- POJ 3280 Cheapest Palindrome(DP)
题目链接 题意 :给你一个字符串,让你删除或添加某些字母让这个字符串变成回文串,删除或添加某个字母要付出相应的代价,问你变成回文所需要的最小的代价是多少. 思路 :DP[i][j]代表的是 i 到 j ...
- POJ 3280 Cheapest Palindrome 简单DP
观察题目我们可以知道,实际上对于一个字母,你在串中删除或者添加本质上一样的,因为既然你添加是为了让其对称,说明有一个孤立的字母没有配对的,也就可以删掉,也能满足对称. 故两种操作看成一种,只需要保留花 ...
- POJ 3280 Cheapest Palindrome (DP)
Description Keeping track of all the cows can be a tricky task so Farmer John has installed a sys ...
- POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)
题目链接:http://poj.org/problem?id=3280 题目大意:给你一个字符串,你可以删除或者增加任意字符,对应有相应的花费,让你通过这些操作使得字符串变为回文串,求最小花费.解题思 ...
随机推荐
- hdu 5536 Chip Factory (01 Trie)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5536 题面; Chip Factory Time Limit: 18000/9000 MS (Java/O ...
- jenkins在windows及linux环境下安装
下载 下载地址: https://jenkins.io/download/ 下载windows和linux通用的war包 jenkins在windows下安装 前提:已经安装jdk.tomcat 将w ...
- django restframework jwt
既然要来学习jwt(json web token),那么我们肯定是先要了解jwt的优势以及应用场景--跨域认证. $ pip install djangorestframework-jwt 传统coo ...
- Linux基本命令总结(八)
接上篇: 38,一次性定时计划任务的at命令的用法! 1.命令格式: at[参数][时间] 2.命令功能: 在一个指定的时间执行一个指定任务,只能执行一次,且需要开启atd进程(ps -ef | gr ...
- Gym - 101350A Sherlock Bones(思维)
The great dog detective Sherlock Bones is on the verge of a new discovery. But for this problem, he ...
- JavaProperties类、序列化流与反序列化流、打印流、commons-IO整理
Properties类 Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串. 特点: 1.Hashtable的子类 ...
- Matlab中hold on与hold off的用法
摘录自:https://blog.csdn.net/smf0504/article/details/51830963 https://www.cnblogs.com/shuqingstudy/p/48 ...
- TCP和UDP
目录: TCP流式协议 TCP模板 TCP聊天室 TCP通信与连接循环 TCP粘包 socketserver实现并发 UDP数据报协议 UDP模板 UDP传输 socketserver实现并发 TCP ...
- unix域字节流回射程序
一.服务端程序 #include <stdio.h> #include <errno.h> #include <stdlib.h> #include <uni ...
- 在JS中如何判断所输入的是一个数、整数、正数、非数值?
1.判断是否为一个数字: Number(num)不为 NaN,说明为数字 2. 判断一个数为正数: var num=prompt("请输入:"); if(Number(num)&g ...