nyoj 1023 还是回文(区间DP)
来源:互联网 发布:抓住那个家伙知乎 编辑:程序博客网 时间:2024/05/21 08:35
还是回文
描述
判断回文串很简单,把字符串变成回文串也不难。现在我们增加点难度,给出一串字符(全部是小写字母),添加或删除一个字符,都会产生一定的花费。那么,将字符串变成回文串的最小花费是多少呢?
输入
多组数据第一个有两个数n,m,分别表示字符的种数和字符串的长度第二行给出一串字符,接下来n行,每行有一个字符(a~z)和两个整数,分别表示添加和删除这个字符的花费所有数都不超过2000
输出
最小花费
样例输入
3 4abcba 1000 1100b 350 700c 200 800
样例输出
900
ps:区间dp
借鉴大神原话:
dp[i][j]表示i到j已经是回文串的最小花费,则有三种情况
1、dp[i+1][j]表示区间i到区间j已经是回文串了的最小花费,那么对于s[i]这个字母,我们有两种操作,添加与删除,对应有两种代价,dp[i+1][j]+add[s[i]],dp[i+1][j]+del[s[i]],取这两种代价的最小值;
2、dp[i][j-1]表示区间i到区间j-1已经是回文串了的最小花费,那么对于s[j]这个字母,同样有两种操作,dp[i][j-1]+add[s[j]],dp[i][j-1]+del[s[j]],取最小值
3、若是s[i]==s[j],dp[i+1][j-1]表示区间i+1到区间j-1已经是回文串的最小代价,那么对于这种情况,我们考虑dp[i][j]与dp[i+1][j-1]的大小……..
然后dp[i][j]取上面这些情况的最小值………
代码:
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;char str[2010];int dp[2010][2010];int v[30];int main(){ int n,m; while(~scanf("%d%d",&n,&m)) { memset(dp,0,sizeof(dp)); scanf("%s",str+1); char s[10]; int a,b; for(int i=0; i<n; ++i) { scanf("%s %d%d",s,&a,&b); v[s[0]-'a']=min(a,b); } for(int i=m-1; i>0; --i) for(int j=i+1; j<=m; ++j) { dp[i][j]=min(dp[i+1][j]+v[str[i]-'a'],dp[i][j-1]+v[str[j]-'a']); if(str[i]==str[j]) dp[i][j]=min(dp[i][j],dp[i+1][j-1]); } printf("%d\n",dp[1][m]); } return 0;}
阅读全文
1 0
- nyoj 1023 还是回文(区间DP)
- nyoj 1023 还是回文 (区间dp加贪心)
- NYOJ 题目1023 还是回文(dp)
- nyoj 还是回文 1023 (DP)
- nyoj 1023 还是回文(dp)
- 还是回文----区间dp
- NYOJ1023 还是回文(区间dp)
- nyoj1023还是回文【区间dp】
- njoj1023 还是回文(区间dp)
- NYOJ1023 还是回文(区间DP)
- NYOJ 1023还是回文
- NYOJ-1023-还是回文
- nyoj 1023 还是回文
- NYOJ1023 还是回文(区间DP,详细)
- NYOJ 1023 还是回文(DP,花最少费用形成回文串)
- 切割回文(区间dp)
- NYOJ 1023 还是回文(思路复杂)
- nyoj--1023--还是回文(动态规划)
- 第八届ACM校赛->上色的纱雾
- embedding可视化/yale人脸数据集
- 个人小笔记
- Vue之插件使用
- JVM知识点汇总(转载)
- nyoj 1023 还是回文(区间DP)
- Codeforces-425 (Div. 2)-D(最近公共祖先->倍增)
- java基本数据类型
- linux-9 openssh
- 百练_2927:判断数字个数
- 荷兰国旗问题
- break和continue区别
- 无关选择
- 游戏game