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 ...
随机推荐
- z-index 、层叠上下文、层叠级别、z-index失效
一.z-index z-index默认处于非激活状态,只有定位元素(即position:relative/absolute/fixed时)才会被激活. z-index与层叠上下文关联. 当z-inde ...
- C# 取两位小数
double s=0.55555;result=s.ToString("#0.00");//点后面几个0就保留几位 如果要四舍五入的话,用这个double dbdata = 0.5 ...
- A - Design Tutorial: Learn from Math(哥德巴赫猜想)
Problem description One way to create a task is to learn from math. You can generate some random mat ...
- [原创]Linux(CentOS)下安装mongodb
和上一篇一样,装个这个踩了无数个坑…… 1.下载 wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel55-3.2.12.tgz ...
- session 存入redis 或 memcache 的方法
Session简介 session,中文经常翻译为会话,其本来的含义是 指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session.有时候我们 ...
- Django逻辑关系
title: Django学习笔记 subtitle: 1. Django逻辑关系 date: 2018-12-14 10:17:28 --- Django逻辑关系 本文档主要基于Django2.2官 ...
- mysql主主同步
Mysql 主主同步方案 第一台机器主 [root@master ~]# vim /etc/my.cnf [mysqld] server-id=1 log-bin=mysql-binlog log-s ...
- eas之网络互斥功能示手工控制
public void doMutexService() { IMutexServiceControl mutex = MutexServiceControlFactory.get ...
- 单行函数、表连接(day02)
回顾: 1.数据库介绍 sql: dql: select dml: insert delete update ddl: create drop alter tcl: commit rollback s ...
- mysql字符集和排序规则
1.关于字符集和排序规则所为字符集,就是用来定义字符在数据库中的编码的集合.常见的字符集有:utf8(支持中文)和AccIS(不支持中文) 数据库中的排序规则用来定义字符在进行排序和比较的时候的一种规 ...