洛谷P2890 [USACO07OPEN]便宜的回文Cheapest Palindrome
题目链接:
题目分析:
玄学\(dp\)
设\(val[s[i] - 'a' + 1]\)表示字母\(s[i]\)的花费
首先发现对于一个已经回文了的串\(s[i, j]\),在\(s[i - 1]\)的位置上删去和在\(s[j + 1]\)的位置上加上本质上是一样的,所以\(val[s[i] - 'a' + 1]\)直接取增删的最小即可
设\(dp[i][j]\)表示把\(s[i, j]\)变成回文串的最小代价,初始化所有花费为\(INF\),\(dp[i][i] =0\),如果有\(s[i] == s[i + 1]\),那么有\(dp[i][j + 1] = 0\)
然后是玄学的转移方程,稍微分情况讨论一下:
- 若有\(s[i - 1] == s[j + 1]\),则\(dp[i - 1][j + 1] = min(dp[i - 1][j + 1], dp[i][j])\)
- \(dp[i - 1][j] = min(dp[i - 1][j], dp[i][j] + val[s[i - 1] - 'a' + 1])\)
- \(dp[i][j + 1] = min(dp[i][j + 1], dp[i][j] + val[s[j + 1] - 'a' + 1])\)
答案即为\(dp[1][m]\)
代码:
#include<bits/stdc++.h>
#define N (2000 + 10)
using namespace std;
inline int read() {
int cnt = 0, f = 1; char c = getchar();
while (!isdigit(c)) {if (c == '-') f = -f; c = getchar();}
while (isdigit(c)) {cnt = (cnt << 3) + (cnt << 1) + c - '0'; c = getchar();}
return cnt * f;
}
const int INF = 1000000000 + 7;
int n, m, x, y;
char s[N], c;
int val[30], dp[N][N];
int main() {
n = read(), m = read();
scanf("%s", s + 1);
for (register int i = 1; i <= n; i++) {
cin >> c;
x = read(), y = read();
val[c - 'a' + 1] = min(x, y);
}
for (register int i = 0; i <= m; ++i)
for (register int j = 0; j <= m; ++j) dp[i][j] = INF;
for (register int i = 1; i <= m; i++) {
dp[i][i] = 0;
if (s[i] == s[i + 1]) dp[i][i + 1] = 0;
}
for (register int l = 0; l <= m; ++l)
for (register int i = 1; i <= m; ++i) {
int j = i + l;
if (s[i - 1] == s[j + 1]) dp[i - 1][j + 1] = min(dp[i - 1][j + 1], dp[i][j]);
dp[i - 1][j] = min(dp[i - 1][j], dp[i][j] + val[s[i - 1] - 'a' + 1]);
dp[i][j + 1] = min(dp[i][j + 1], dp[i][j] + val[s[j + 1] - 'a' + 1]);
}
printf("%d", dp[1][m]);
return 0;
}
洛谷P2890 [USACO07OPEN]便宜的回文Cheapest Palindrome的更多相关文章
- 洛谷 2890 [USACO07OPEN]便宜的回文Cheapest Palindrome
传送门 一道最简单的区间dp,然而我还是抄了题解. //Twenty #include<algorithm> #include<iostream> #include<cs ...
- 2018.06.29 洛谷P2890 [USACO07OPEN]便宜的回文(简单dp)
P2890 [USACO07OPEN]便宜的回文Cheapest Palindrome 时空限制 1000ms / 128MB 题目描述 Keeping track of all the cows c ...
- [DP]P2890 [USACO07OPEN]便宜的回文Cheapest Palindrome
题目翻译(借鉴自@ 神犇的蒟蒻) [问题描述] 追踪每头奶牛的去向是一件棘手的任务,为此农夫约翰安装了一套自动系统.他在每头牛身 上安装了一个电子身份标签,当奶牛通过扫描器的时候,系统可以读取奶牛的身 ...
- [USACO07OPEN]便宜的回文Cheapest Palindrome
字串S长M,由N个小写字母构成.欲通过增删字母将其变为回文串,增删特定字母花费不同,求最小花费. 题目描述见上 显然 这是一道区间DP 从两头DP,枚举长度啥的很套 ...
- [luoguP2890] [USACO07OPEN]便宜的回文Cheapest Palindrome(DP)
传送门 f[i][j] 表示区间 i 到 j 变为回文串所需最小费用 1.s[i] == s[j] f[i][j] = f[i + 1][j - 1] 2.s[i] != s[j] f[i][j] = ...
- 洛谷P1207 [USACO1.2]双重回文数 Dual Palindromes
P1207 [USACO1.2]双重回文数 Dual Palindromes 291通过 462提交 题目提供者该用户不存在 标签USACO 难度普及- 提交 讨论 题解 最新讨论 暂时没有讨论 ...
- 洛谷oj U3936(分成回文串) 邀请码:a0c9
题目链接:传送门 题目大意:略 题目思路:DP 先预处理,分别以每个字母为中心处理能形成的回文串,再以两个字母为中心处理能形成的回文串. 然后 dp[i] 表示1~i 能形成的数目最少的回文串. 转移 ...
- 【洛谷4287】[SHOI2011] 双倍回文(Manacher算法经典题)
点此看题面 大致题意: 求一个字符串中有多少个长度为偶数的回文串,它的一半也是回文串. \(Manacher\)算法 这应该是\(Manacher\)算法一道比较好的入门题,强烈建议在做这题之前先去学 ...
- 洛谷 P1207 [USACO1.2]双重回文数 Dual Palindromes
P1207 [USACO1.2]双重回文数 Dual Palindromes 题目描述 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”.例如,12321就是一个回文数,而7777 ...
随机推荐
- python自动生成useragent
首先安装相关的库 pip install fake-useragent 然后使用该库 from fake_useragent import UserAgent ua = UserAgent() ua. ...
- C++之程序流程_选择结构
C/C++支持最基本的三种程序运行结构:==顺序结构.选择结构.循环结构== * 顺序结构:程序按顺序执行,不发生跳转* 选择结构:依据条件是否满足,有选择的执行相应功能* 循环结构:依据条件是否满足 ...
- List<> ,string[]和string的相互转换
1.string转换成string[]数组 string str = "aaa,bbb,ccc,dddd"; string[] strs = str.Split(','); 2.s ...
- C# interface (接口基础知识详解)
Interface(接口) (本文转载地址:http://blog.sina.com.cn/s/blog_574c993d0100d59n.html) 介绍:C#中的接口提供了一种实现运行时的多态.通 ...
- 简单的GridView分业,后台不需要写
1前台代码: <asp:GridView ID="GridView1" runat="server" AllowPaging="True&quo ...
- web Magic报错 NoSuchMethodError NoSuchMethodError: com.google.common.util.concurrent.SimpleTimeLimiter
webMagic使用selenium的时候遇到报错: java.lang.NoSuchMethodError: com.google.common.util.concurrent.SimpleTime ...
- JLOI 2013 卡牌游戏 bzoj3191
题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先把 ...
- linxu(centos)安装nginx
安装make: yum -y install gcc automake autoconf libtool make 安装g++: yum install gcc gcc-c++ 下面正式开始 ---- ...
- Linux 中执行Shell 脚本的方式(三种方法)
Shell 脚本的执行方式通常有如下三种: (1)bash script-name 或者 sh script-name:(2)path/script-name或者./script-name:(3)so ...
- Invalid argument value:无效参数值。原因是:把Session值user0当做username作为参数了。 而实际上此时username是user0的成员变量。参数应该是user0.getUsername();然后发现别人的List得加泛型,我的怎么不用加,运行报错,上网收了错误原因,因为导包错误,不小心导错包了,改为util.List包对了。