Keeping track of all the cows can be a tricky task so Farmer John has installed a system to automate it. He has installed on each cow an electronic ID tag that the system will read as the cows pass by a scanner. Each ID tag's contents are currently a single string with length M (1 ≤ M ≤ 2,000) characters drawn from an alphabet of N (1 ≤ N ≤ 26) different symbols (namely, the lower-case roman alphabet).

Cows, being the mischievous creatures they are, sometimes try to spoof the system by walking backwards. While a cow whose ID is "abcba" would read the same no matter which direction the she walks, a cow with the ID "abcb" can potentially register as two different IDs ("abcb" and "bcba").

FJ would like to change the cows's ID tags so they read the same no matter which direction the cow walks by. For example, "abcb" can be changed by adding "a" at the end to form "abcba" so that the ID is palindromic (reads the same forwards and backwards). Some other ways to change the ID to be palindromic are include adding the three letters "bcb" to the begining to yield the ID "bcbabcb" or removing the letter "a" to yield the ID "bcb". One can add or remove characters at any location in the string yielding a string longer or shorter than the original string.

Unfortunately as the ID tags are electronic, each character insertion or deletion has a cost (0 ≤ cost ≤ 10,000) which varies depending on exactly which character value to be added or deleted. Given the content of a cow's ID tag and the cost of inserting or deleting each of the alphabet's characters, find the minimum cost to change the ID tag so it satisfies FJ's requirements. An empty ID tag is considered to satisfy the requirements of reading the same forward and backward. Only letters with associated costs can be added to a string.

Input

Line 1: Two space-separated integers: N and M
Line 2: This line contains exactly
M characters which constitute the initial ID string

Lines 3..
N+2: Each line contains three space-separated entities: a
character of the input alphabet and two integers which are respectively
the cost of adding and deleting that character.

Output

Line 1: A single line with a single integer that is the minimum cost to change the given name tag.

Sample Input

3 4
abcb
a 1000 1100
b 350 700
c 200 800

Sample Output

900

Hint

If we insert an "a" on the end to get "abcba", the cost would be 1000. If we delete the "a" on the beginning to get "bcb", the cost would be 1100. If we insert "bcb" at the begining of the string, the cost would be 350 + 200 + 350 = 900, which is the minimum.
 
题解:
  这个题目有wa了一次,才a。
  套路区间dp的解法,dp[i][j]表示把i~j改成回文的最小代价。如果s[i]==s[j]那么显然有一种转移dp[i][j]=dp[i+1][j-1],然后就是第二种可以一个一个删除或者加,dp[i][j]=dp[i+1][j]+cost[s[i]-'a'],dp[i][j]=dp[i][j-1]+cost[s[j]-'a']。
 
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#define MAXN 2010
using namespace std;
char s[MAXN];
int dp[MAXN][MAXN];
int cost[MAXN];
int n,len; int main()
{
scanf("%d%d",&n,&len);
scanf("%s",s+);
for(int i=;i<=n;i++){
char x;scanf("%c",&x);scanf("%c",&x);
int xx,yy;
scanf("%d%d",&xx,&yy);cost[x-'a']=min(xx,yy);
}
memset(dp,/,sizeof(dp));
for(int i=;i<=len;i++) dp[i][i]=,dp[i][i-]=;
for(int lenn=;lenn<len;lenn++){
for(int i=;i+lenn<=len;i++){
int j=i+lenn;
if(s[i]==s[j]) dp[i][j]=dp[i+][j-];
dp[i][j]=min(dp[i][j],min(dp[i+][j]+cost[s[i]-'a'],dp[i][j-]+cost[s[j]-'a']));
}
}
printf("%d",dp[][len]);
return ;
}

最新文章

  1. android studio 换护眼的颜色步骤
  2. 洛谷 P1160 队列安排 Label:链表 数据结构
  3. Python之路-python(set集合、文本操作、字符编码 )
  4. jnlp jws
  5. 查看Linux硬件配置信息
  6. 阿里云无线&amp;前端团队是如何基于webpack实现前端工程化的
  7. 下拉刷新控件(3)系统自带的下拉刷新控件SwipeRefreshLayout(推荐*)
  8. 对于requirejs AMD模块加载的理解
  9. wcf iis host 打开exe失败 不能显示界面
  10. ASP 代码当前记录集不支持更新问题的解决办法。
  11. poj3974(manacher)
  12. 线程中sleep方法和wait方法有什么区别?
  13. 私人网盘系统2.0—全部升级为layUI+PHP(持续更新中)shang
  14. 反射---hasattr、getattr、setattr、delattr
  15. C++模板的要点
  16. Leetcode 202.快乐数 By Python
  17. vue 数组push元素 视图没更新
  18. AME_IExpense费用报表通过AME审批简单例子(案例)
  19. 20145311 《Java程序设计》第2周学习总结
  20. 设置myeclipse文件的打开格式

热门文章

  1. 【Offer】[5] 【替换空格】
  2. 【LeetCode】33-搜索旋转排序数组
  3. C# 表达式树分页扩展(三)
  4. 谈谈你对HTML语义化的理解。
  5. 创建多线程之threading.Thread的使用
  6. BeanCopier类
  7. Java线程常见面试题
  8. 从零开始入门 K8s| 详解 Pod 及容器设计模式
  9. java需要了解和学习的技能
  10. 带你入门SpringCloud统一配置 | SpringCloud Config