看到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题解的更多相关文章

  1. poj 3280 Cheapest Palindrome ---(DP 回文串)

    题目链接:http://poj.org/problem?id=3280 思路: dp[i][j] :=第i个字符到第j个字符之间形成回文串的最小费用. dp[i][j]=min(dp[i+1][j]+ ...

  2. POJ 3280 Cheapest Palindrome(DP)

    题目链接 被以前的题目惯性思维了,此题dp[i][j],代表i到j这一段变成回文的最小花费.我觉得挺难的理解的. #include <cstdio> #include <cstrin ...

  3. POJ 3280 - Cheapest Palindrome - [区间DP]

    题目链接:http://poj.org/problem?id=3280 Time Limit: 2000MS Memory Limit: 65536K Description Keeping trac ...

  4. POJ 3280 Cheapest Palindrome(DP 回文变形)

    题目链接:http://poj.org/problem?id=3280 题目大意:给定一个字符串,可以删除增加,每个操作都有代价,求出将字符串转换成回文串的最小代价 Sample Input 3 4 ...

  5. POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)

    题目链接:http://poj.org/problem?id=3280 题目大意:给你一个字符串,你可以删除或者增加任意字符,对应有相应的花费,让你通过这些操作使得字符串变为回文串,求最小花费.解题思 ...

  6. (中等) POJ 3280 Cheapest Palindrome,DP。

    Description Keeping track of all the cows can be a tricky task so Farmer John has installed a system ...

  7. POJ 3280 Cheapest Palindrome(DP)

    题目链接 题意 :给你一个字符串,让你删除或添加某些字母让这个字符串变成回文串,删除或添加某个字母要付出相应的代价,问你变成回文所需要的最小的代价是多少. 思路 :DP[i][j]代表的是 i 到 j ...

  8. POJ 3280 Cheapest Palindrome 简单DP

    观察题目我们可以知道,实际上对于一个字母,你在串中删除或者添加本质上一样的,因为既然你添加是为了让其对称,说明有一个孤立的字母没有配对的,也就可以删掉,也能满足对称. 故两种操作看成一种,只需要保留花 ...

  9. POJ 3280 Cheapest Palindrome (DP)

     Description Keeping track of all the cows can be a tricky task so Farmer John has installed a sys ...

随机推荐

  1. (Go)08.time示例

    package main import ( "fmt" "time" ) func test() { ) } func main() { now := time ...

  2. [CodeForces522B] Photo to Remember

    某一天,n个朋友在一起聚会,他们已经很久没见了,于是他们决定拍照留念. 简单的说,拍照的时候,每个人有一个高度和宽度,第i个的高度和宽度分别是hi和wi.这些人排成一条直线,照片的最小的面积必须包含所 ...

  3. python 线程池和锁

    一.死锁现象与递归锁 锁:Lock线程安全,多线程操作时,内部会让所有线程排队处理.如:list/dict/Queue        线程不安全 + 人 => 排队处理. import thre ...

  4. python 字符编码的两种方式写法:# coding=utf-8和# -*- coding:utf-8 -*-

    python运行文件是总会出现乱码问题,为了解决这个问题,在文件开头加上: # coding=utf-8 或者 # -*- coding:utf-8  -*- # coding=<encodin ...

  5. RabbitMQ 官方NET教程(一)【介绍】

    本教程假定RabbitMQ已在标准端口(5672)上的localhost上安装并运行.如果使用不同的主机,端口或凭据,连接设置将需要调整. RabbitMQ是一个消息代理:它接受并转发消息. 您可以将 ...

  6. 用 Django2.0 做 简单的BBS(前端用 Bootstrap)

    实现目标: 开发首页显示BBS的标题和摘要,点击BBS的标题可跳转到BBS详细页面进行展示. 开发环境及开发工具: Python 3.6.3 Django 2.0 Pycharm 2017.3 实现过 ...

  7. android AIDL示例代码(mark下)

    1.demo结构图 2.ipcclient Book类. package com.mu.guoxw.ipcclient; import android.os.Parcel; import androi ...

  8. ASP.NET刷新页面的六种方法

    第一: private void Button1_Click( object sender, System.EventArgs e )   {      Response.Redirect( Requ ...

  9. 使用GitGUI创建上传本地工程

    参考链接: 使用Git-GUI创建工程 http://jingyan.baidu.com/article/27fa732683ebf546f8271f2e.html 一.刚创建的github版本库,在 ...

  10. 工作中总结的经验之git篇

    不要以为你会git,你要知道,git不是只有commit和push 由于系统分析与设计的期末Project需要团队合作开发,因此在这里想谈谈GitHub团队项目合作开发的流程: 项目创建 项目负责人在 ...