【bzoj1710】[Usaco2007 Open]Cheappal 廉价回文

【bzoj1710】[Usaco2007 Open]Cheappal 廉价回文

Description

为了跟踪所有的牛,农夫JOHN在农场上装了一套自动系统. 他给了每一个头牛一个电子牌号 当牛走过这个系统时,牛的名字将被自动读入. 每一头牛的电子名字是一个长度为M (1 <= M <= 2,000) 由N (1 <= N <= 26) 个不同字母构成的字符串.很快,淘气的牛找到了系统的漏洞:它们可以倒着走过读 码器. 一头名字为”abcba”不会导致任何问题,但是名为”abcb”的牛会变成两头牛(“abcb” 和 “bcba”).农 夫JOHN想改变牛的名字,使得牛的名字正读和反读都一样.例如,”abcb”可以由在尾部添加”a”.别的方法包 括在头上添加”bcb”,得到”bcbabcb”或去掉”a”,得到”bcb”.JOHN可以在任意位置添加或删除字母.因为名字 是电子的,添加和删除字母都会有一定费用.添加和删除每一个字母都有一定的费用(0 <= 费用 <= 10,000). 对与一个牛的名字和所有添加或删除字母的费用,找出修改名字的最小的费用.空字符串也是一个合法的名字.

Input

* 第一行: 两个用空格分开的数, N 和 M.

* 第二行: M个自符,初始的牛的名字.

* 第3…N+2行: 每行含有一个字母和两个整数,分别是添加和删除这个字母的费用.

Output

一个整数, 改变现有名字的最小费用.

Sample Input

3 4
abcb
a 1000 1100
b 350 700
c 200 800
输入解释:
名字是 “abcb”, 操作费用如下:
添加 删除
a 1000 1100
b 350 700
c 200 800

Sample Output

900
输出解释:
在尾部添加”a”得到”abcba”的费用为1000. 删除头上的”a”,得到”bcb”的费用为1100.在头上添加”bcb”可以得到最小费用,350+200+350=900.

题解

加入一个数可以视为删除一个数,那么问题转化为删数回文串

n^2dp即可

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cmath>
 6 #define F(i,j,n) for(int i=j;i<=n;i++)
 7 #define D(i,j,n) for(int i=j;i>=n;i--)
 8 #define ll long long
 9 #define maxn 2005
10 using namespace std;
11 char s[maxn],ch;
12 int m,n,x,y;
13 int f[maxn][maxn],w[30];
14 inline int read()
15 {
16     int x=0,f=1;char ch=getchar();
17     while (ch<‘0‘||ch>‘9‘){if (ch==‘-‘) f=-1;ch=getchar();}
18     while (ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
19     return x*f;
20 }
21 int main()
22 {
23     m=read();n=read();
24     scanf("%s",s+1);
25     F(i,1,m)
26     {
27         scanf("%c",&ch);while (ch<‘a‘||ch>‘z‘) scanf("%c",&ch);
28         x=read();y=read();
29         w[ch-‘a‘]=min(x,y);
30     }
31     D(i,n-1,1) F(j,i+1,n)
32     {
33         f[i][j]=min(f[i+1][j]+w[s[i]-‘a‘],f[i][j-1]+w[s[j]-‘a‘]);
34         if (s[i]==s[j]) f[i][j]=min(f[i][j],f[i+1][j-1]);
35     }
36     printf("%d\n",f[1][n]);
37 }  

原文地址:https://www.cnblogs.com/fengzhiyuan/p/8143058.html

时间: 2024-10-11 03:55:20

【bzoj1710】[Usaco2007 Open]Cheappal 廉价回文的相关文章

动态规划 BZOJ1710 [Usaco2007 Open]Cheappal 廉价回文

1710: [Usaco2007 Open]Cheappal 廉价回文 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 596  Solved: 338[Submit][Status][Discuss] Description 为了跟踪所有的牛,农夫JOHN在农场上装了一套自动系统. 他给了每一个头牛一个电子牌号 当牛走过这个系统时,牛的名字将被自动读入. 每一头牛的电子名字是一个长度为M (1 <= M <= 2,000) 由N (1 <=

[BZOJ1710][Usaco2007 Open]Cheappal 廉价回文

1710: [Usaco2007 Open]Cheappal 廉价回文 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 645  Solved: 361 [Submit][Status][Discuss] Description 为了跟踪所有的牛,农夫JOHN在农场上装了一套自动系统. 他给了每一个头牛一个电子牌号 当牛走过这个系统时,牛的名字将被自动读入. 每一头牛的电子名字是一个长度为M (1 <= M <= 2,000) 由N (1 <

1710: [Usaco2007 Open]Cheappal 廉价回文

Description 为 了跟踪所有的牛,农夫JOHN在农场上装了一套自动系统. 他给了每一个头牛一个电子牌号 当牛走过这个系统时,牛的名字将被自动读入. 每一头牛的电子名字是一个长度为M (1 <= M <= 2,000) 由N (1 <= N <= 26) 个不同字母构成的字符串.很快,淘气的牛找到了系统的漏洞:它们可以倒着走过读 码器. 一头名字为"abcba"不会导致任何问题,但是名为"abcb"的牛会变成两头牛("abc

BZOJ 1710: [Usaco2007 Open]Cheappal 廉价回文

Description 为了跟踪所有的牛,农夫JOHN在农场上装了一套自动系统. 他给了每一个头牛一个电子牌号 当牛走过这个系统时,牛的名字将被自动读入. 每一头牛的电子名字是一个长度为M (1 <= M <= 2,000) 由N (1 <= N <= 26) 个不同字母构成的字符串.很快,淘气的牛找到了系统的漏洞:它们可以倒着走过读 码器. 一头名字为"abcba"不会导致任何问题,但是名为"abcb"的牛会变成两头牛("abcb

bzoj 1710: [Usaco2007 Open]Cheappal 廉价回文【区间dp】

只要发现添加一个字符和删除一个字符是等价的,就是挺裸的区间dp了 因为在当前位置加上一个字符x就相当于在他的对称位置删掉字符x,所以只要考虑删除即可,删除费用是添加和删除取min 设f[i][j]为从i到j的价格,长度从小到大枚举更新就行了 f[i][j]=min(f[i][j-1]+cost[s[j]],f[i+1][j]+cost[s[i]]),如果s[i]==s[j]还能和f[i+1][j-1]取个min cpp #include<iostream> #include<cstdio

bzoj1710【Usaco2007 Open】Cheappal 便宜回文

1710: [Usaco2007 Open]Cheappal 便宜回文 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 466  Solved: 262 [Submit][Status][Discuss] Description 为了跟踪全部的牛,农夫JOHN在农场上装了一套自己主动系统. 他给了每个头牛一个电子牌号 当牛走过这个系统时,牛的名字将被自己主动读入. 每一头牛的电子名字是一个长度为M (1 <= M <= 2,000) 由N (1 &

16-最少回文数组

Splits the string 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 Hrdv is interested in a string,especially the palindrome string.So he wants some palindrome string. A sequence of characters is a palindrome if it is the same written forwards and backwards. Fo

最少回文串--牛客网(秋招备战专场三模)-C++方向

题目描述:一个字符串从左向右和从右向左读都完全一样则是回文串,给定一个字符串,问该字符串中的字符所能组成的最少的回文串的个数为多少 解题思路:如果一个字符出现的次数为偶数,则必能组成回文串,如果一个字符出现奇数次,只能自己组成回文串,题目中问最少的回文串数目,即求出现次数为奇数次的字符个数即可,定义a存储每个字符出现的次数,统计出现奇数次的字符的个数,即为输出 1 #include <iostream> 2 #include <string> 3 using namespace s

回文判断

一个整形数是否是回文 also leetcode 9 Palindrome Number要求空间复杂度O(1)按位判断一般是/和%的游戏,首先取首位 a/h (h是最接近a的10的次方,比如12321,h预计算出是10000), 再取末位a%10; 比较首位和末位是否相等,不等就返回false; 如图: 然后舍弃掉已经比较过的两个位数,从a中去掉首尾 12321 --> 232. a = a % h; // 去掉首 a = a /10; //去掉尾 h = 100; // 因为已经去掉了两位 如