还是回文

时间限制:2000 ms  |  内存限制:65535 KB
难度:3
 
描述

判断回文串很简单,把字符串变成回文串也不难。现在我们增加点难度,给出一串字符(全部是小写字母),添加或删除一个字符,都会产生一定的花费。那么,将字符串变成回文串的最小花费是多少呢?

 
输入
多组数据
第一个有两个数n,m,分别表示字符的种数和字符串的长度
第二行给出一串字符,接下来n行,每行有一个字符(a~z)和两个整数,分别表示添加和删除这个字符的花费
所有数都不超过2000
输出
最小花费
样例输入
3 4
abcb
a 1000 1100
b 350 700
c 200 800
样例输出
900
上传者
ACM_马振阳
解题:转载一下别人的思路。。。

dp[i][j]代表区间i到区间j成为回文串的最小代价,那么对于dp[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]取上面这些情况的最小值.........

先上挫一点的代码,可以AC的但是速度比较慢
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <climits>
#include <algorithm>
#include <cmath>
#define LL long long
using namespace std;
int dp[][];
int main() {
int m,len,i,j,a,b,temp,temp2;
char s[],t[];
int add[],del[];
while(~scanf("%d %d",&m,&len)) {
scanf("%s",s);
for(i = ; i < m; i++) {
scanf("%s %d %d",t,&a,&b);
add[t[]-'a'] = a;
del[t[]-'a'] = b;
}
for(i = len-; i >= ; i--){
for(j = i+; j < len; j++){
dp[i][j] = min(dp[i+][j]+del[s[i]-'a'],dp[i+][j]+add[s[i]-'a']);
temp = min(dp[i][j-]+del[s[j]-'a'],dp[i][j-]+add[s[j]-'a']);
dp[i][j] = min(dp[i][j],temp);
if(s[i] == s[j]) dp[i][j] = min(dp[i][j],dp[i+][j-]);
}
}
printf("%d\n",dp[][len-]);
}
return ;
}

这个是优化的过代码。优化之后,速度真心快了很多啊。
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <climits>
#include <algorithm>
#include <cmath>
#define LL long long
using namespace std;
int dp[][];
int main() {
int m,len,i,j,a,b,temp,temp2;
char s[],t[];
int cost[];
while(~scanf("%d %d",&m,&len)) {
scanf("%s",s);
for(i = ; i < m; i++) {
scanf("%s %d %d",t,&a,&b);
cost[t[]-'a'] = min(a,b);
}
for(i = len-; i >= ; i--){
for(j = i+; j < len; j++){
dp[i][j] = min(dp[i+][j]+cost[s[i]-'a'],dp[i][j-]+cost[s[j]-'a']);
if(s[i] == s[j]) dp[i][j] = min(dp[i][j],dp[i+][j-]);
}
}
printf("%d\n",dp[][len-]);
}
return ;
}

 

最新文章

  1. 登录(ajax提交数据和后台校验)
  2. Centos、Ubuntu 安装 Mono、Jexus
  3. jQuery插件(右击事件)
  4. c#中实现多个接口出现同名同参的方法
  5. iOS做新浪微博sso授权登录遇到的一些坑
  6. iOS禁用第三方键盘
  7. codeforces 485B Valuable Resources 解题报告
  8. CXF 与Spring整合配置
  9. jQuery回到顶部插件jQuery GoUp
  10. day20&lt;IO流&gt;
  11. go get报错unrecognized import path “golang.org/x/net/context”…
  12. Asp.net Core 微信公众号开发系列
  13. RobotFramework Selenium2 关键字
  14. python 虚拟环境使用与管理(virtualenv)
  15. 目标检测算法之R-CNN算法详解
  16. 超级好看!巧用PS将风光人像打造成唯美的小星球效果!
  17. android adb介绍
  18. zabbix监控系列(5)之通过trap模式监控网络设备
  19. Unity3D 记第一次面试
  20. shell 变量定义使用

热门文章

  1. Perl的Notepad++环境配置
  2. hihocoder1860 最大异或和
  3. Android 面试总结~~~
  4. easyui 刷新页面
  5. Caused by: java.lang.NoClassDefFoundError: com/sun/tools/javac/util/List at
  6. 使用ABAP编程实现对微软Office Word文档的操作
  7. mac ssd开启trim模式
  8. HtmlUnit爬取Ajax动态生成的网页以及自动调用页面javascript函数
  9. chrom浏览器-F2使用方法一
  10. Synchronized关键字整理