码迷,mamicode.com
首页 > 其他好文 > 详细

低价回文

时间:2020-06-23 17:15:09      阅读:48      评论:0      收藏:0      [点我收藏+]

标签:nbsp   通过   自动   题目   segment   初始   dde   its   增加   

题目描述

追踪每头奶牛的去向是一件棘手的任务,为此农夫约翰安装了一套自动系统。他在每头牛身上安装了一个电子身份标签,当奶牛通过扫描器的时候,系统可以读取奶牛的身份信息。目前,每个身份都是由一个字符串组成的,长度为M (1≤M≤2000),所有的字符都取自小写的罗马字母。

奶牛们都是顽皮的动物,有时她们会在通过扫描器的时候倒着走,这样一个原来身份为abcb的奶牛就可能有两个不同的身份了(abcb和bcba),而如果身份是abcba的话就不会有这个问题了。

约翰想改变奶牛们的身份,使他们不管怎么走读起来都一样。比如说,abcb可以在最后加个a,变成回文abcba;也可以在前面加上bcb,变成回文bcbabcb;或者去除字母a,保留的bcb也是一条回文。总之,约翰可以在任意位置删除或插入一些字符使原字符串变成回文。

不巧的是,身份标签是电子做的,每增加或删除一个字母都要付出相应的费用(0≤代价≤10000)。给定一头奶牛的身份标签和增加或删除相关字母的费用,找出把原来字符串变成回文的最小费用。注意空字符串也是回文。

输入格式

第一行:两个用空格分开的整数:N和M 第二行:一个长度恰好为M的字符串,代表初始的身份标签 第三行到第N+2行:每行为一个用空格分开的三元组:其中包括一个字符和两个整数,分别表示增加或删除这个字符的费用

输出格式

第一行:只有一个整数,表示改造这个身份标签的最小费用

样例

样例输入

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

样例输出

900

数据范围与提示

如果在最后插入一个a,得到abcba,代价为1000;如果删除第一个a,得到bcb,代价为1100;如果在字符串的开头插入bcb,代价为350+200+350=900,这才是最优的做法

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int n=2010;
 4 int N,M;
 5 char s[n];
 6 int v[n];
 7 int f[n][n];
 8 
 9 
10 
11 
12 int main(){
13     scanf("%d%d",&N,&M);
14     scanf("%s",s+1);
15     for(int i=1;i<=N;i++){
16         char ch;
17         int v1,v2;
18         scanf(" %c%d%d",&ch,&v1,&v2);
19         v[ch-a]=min(v1,v2);
20     }
21     for(int j=2;j<=M;j++){
22         for(int i=j-1;i>=1;i--){
23             if(s[i]==s[j]){
24                 f[i][j]=f[i+1][j-1];
25             } else {
26                 f[i][j]=min(f[i+1][j]+v[s[i]-a],f[i][j-1]+v[s[j]-a]);
27             }
28         }
29     }
30     printf("%d",f[1][M]);
31     return 0;
32 }

 

低价回文

标签:nbsp   通过   自动   题目   segment   初始   dde   its   增加   

原文地址:https://www.cnblogs.com/LightyaChoo/p/13183086.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!