POJ 3280 Cheapest Palindrome DP题解
看到Palindrome的题目。首先想到的应该是中心问题,然后从中心出发,思考怎样解决。
DP问题通常是从更加小的问题转化到更加大的问题。然后是从地往上 bottom up地计算答案的。
能得出状态转移方程就好办了,本题的状态转移方程是:
if (cowID[i] == cow{j]) tbl[id][i] = tbl[id][i+1];//相等的时候无需修改
else tbl[id][i] = min(tbl[!id][i+1] + cost[cowID[i]-'a'], tbl[!id][i] + cost[cowID[j]-'a']);//不相等的时候须要看修改那一边的字符比較划算
注意:
1 cost的删除和插入对于DP来说实际是一样的操作,所以仅仅须要报出一个最小的cost就能够了
2 cost的值是以字母为下标保存值的。不是按顺序给出的,也可能某些字母的值没有给出,这个时候默认应该为零
最后是须要节省内存,这些题目一般能够仅仅看一维dp table数组就能够了,这个时候要二维转化为一维保存结果,实际測试内存节省许多。
这里使用所谓的滚动数组,轮流使用两个数组记录数据。
主要把二维表的斜对角格转为一个数组保存,相应好下标就能够了。
#include <stdio.h>
#include <string.h> const int MAX_M = 2001;
const int MAX_N = 26;
char cowID[MAX_M];
int cost[MAX_N];//minimum of the cost of adding and deleting that character.
int tbl[2][MAX_M];
int N, M; inline int min(int a, int b) { return a < b ? a : b; } int getMinCost()
{
memset(tbl[0], 0, sizeof(int)*M);
memset(tbl[1], 0, sizeof(int)*M);
bool id = false;
for (int d = 2; d <= M; d++)
{
id = !id;
for (int i = 0, j = d-1; j < M; i++, j++)
{
if (cowID[i] == cowID[j]) tbl[id][i] = tbl[id][i+1];
else
{
int c1 = tbl[!id][i+1] + cost[cowID[i]-'a'];
int c2 = tbl[!id][i] + cost[cowID[j]-'a'];
tbl[id][i] = min(c1, c2);
}
}
}
return tbl[id][0];
} int main()
{
char a;
int c1, c2;
while (scanf("%d %d", &N, &M) != EOF)
{
memset(cost, 0, sizeof(int)*N);
getchar(); gets(cowID);
for (int i = 0; i < N; i++)
{
a = getchar();
scanf("%d %d", &c1, &c2);
cost[a-'a'] = min(c1, c2);//only need to save the minimum
getchar();
}
printf("%d\n", getMinCost());
}
return 0;
}
POJ 3280 Cheapest Palindrome DP题解的更多相关文章
- poj 3280 Cheapest Palindrome ---(DP 回文串)
题目链接:http://poj.org/problem?id=3280 思路: dp[i][j] :=第i个字符到第j个字符之间形成回文串的最小费用. dp[i][j]=min(dp[i+1][j]+ ...
- POJ 3280 Cheapest Palindrome(DP)
题目链接 被以前的题目惯性思维了,此题dp[i][j],代表i到j这一段变成回文的最小花费.我觉得挺难的理解的. #include <cstdio> #include <cstrin ...
- POJ 3280 - Cheapest Palindrome - [区间DP]
题目链接:http://poj.org/problem?id=3280 Time Limit: 2000MS Memory Limit: 65536K Description Keeping trac ...
- POJ 3280 Cheapest Palindrome(DP 回文变形)
题目链接:http://poj.org/problem?id=3280 题目大意:给定一个字符串,可以删除增加,每个操作都有代价,求出将字符串转换成回文串的最小代价 Sample Input 3 4 ...
- POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)
题目链接:http://poj.org/problem?id=3280 题目大意:给你一个字符串,你可以删除或者增加任意字符,对应有相应的花费,让你通过这些操作使得字符串变为回文串,求最小花费.解题思 ...
- (中等) POJ 3280 Cheapest Palindrome,DP。
Description Keeping track of all the cows can be a tricky task so Farmer John has installed a system ...
- POJ 3280 Cheapest Palindrome(DP)
题目链接 题意 :给你一个字符串,让你删除或添加某些字母让这个字符串变成回文串,删除或添加某个字母要付出相应的代价,问你变成回文所需要的最小的代价是多少. 思路 :DP[i][j]代表的是 i 到 j ...
- POJ 3280 Cheapest Palindrome 简单DP
观察题目我们可以知道,实际上对于一个字母,你在串中删除或者添加本质上一样的,因为既然你添加是为了让其对称,说明有一个孤立的字母没有配对的,也就可以删掉,也能满足对称. 故两种操作看成一种,只需要保留花 ...
- POJ 3280 Cheapest Palindrome (DP)
Description Keeping track of all the cows can be a tricky task so Farmer John has installed a sys ...
随机推荐
- codevs1959拔河比赛(二维费用背包)
1959 拔河比赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人 ...
- cors解决跨越问题
转载于http://www.cnblogs.com/jiangwz/p/8142740.html Cross-Origin Resource Sharing(CORS)跨来源资源共享是一份浏览器技术的 ...
- BZOJ 4698 差分+后缀数组
思路: 对所有序列差分一下 公共串的长度+1就是答案了 二分 扫一遍height即可,.. //By SiriusRen #include <cstdio> #include <cs ...
- POJ 2553 Tarjan
题意:如果v点能到的所有点反过来又能到v点,则v点是sink点,排序后输出所有的sink点. 思路:Tarjan缩点,输出所有出度为0的连通块内的点. PS:一定要记得把数组清零!!!!!!!否则自己 ...
- 树莓派-解决apt-get upgrade速度慢的方法[更换阿里云源]
执行 apt-get upgrade 遇到速度慢的原因: 使用国外软件源 解决方法也很简单,将源换为国内环境即可,我选择阿里云 步骤 1.备份为 sources.list sudo cp /etc/a ...
- C#:设置webBrowser框架与系统相对应的IE内核版本
通常情况下,我们直接调用C#的webBrowser控件,默认的浏览器内核是IE7. 那么如何修改控件调用的默认浏览器版本呢? /// <summary> /// 修改注册表信息来兼容当前 ...
- SQLServer2008 关于Having
转自百度百科 与where 相比 HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似. WHERE 子句搜索条件在进行分组操作之前应用: ...
- 前端-git思维导图笔记
命令汇总 git config配置本地仓库 常用git config --global user.name.git config --global user.email git config --li ...
- 出现“ORA-28000:the account is locked”的解决办法
在Oracle 11g版本中,出于安全的考虑,所有Oracle的默认用户,包括SCOTT用户都被锁定.输入用户名和口令之后,会出现错误“ORA-28000:the account is locked” ...
- Windows7 win10 系统如何强制禁用驱动程序签名
转载自奇兔 Win7 64位系统禁用驱动程序签名强制 Win7系统是比较稳定的一款系统,也是最多人在使用的一款系统.当我们在Win7系统中安装驱动程序的时候,对安装的驱动程序需要数字签名,否则驱 ...