Cheapest Palindrome poj-3280

    题目大意:给出一个字符串,以及每种字符的加入代价和删除代价,求将这个字符串通过删减元素变成回文字符串的最小代价。

    注释:每种字符都是小写英文字符,1<=代价cost<=1000,字符串长度<=2000.

      想法:通过之前两道区间dp的铺垫,对区间dp有了一个大概的了解,但是这道题无疑是一道比较特别的区间dp。

        首先,我们设dp状态,这显然是容易的:ans[i][j]表示将原字符串从i到j变成回文串的最小代价。

        之后,我们考虑转移方程:对于一个字符串,我们显然不可以想之前的dp一样枚举端点,一是回文串并不满足两个回文串捏一起还是回文串的性质;二是枚举断点的时间复杂度是$O(n^3)$的,我们并不能承受。考虑其他的转移方式,通过回文串的性质,我们可以很清楚的明白——只有通过这个字符串的中间进行转移才是可行的。我们想到:

        分两种情况:

        1.s[i]==s[j]这时ans[i][j]=ans[i+1][j-1](此处注意,当这个字符串长度是2时,ans[i][j]=0)

        2.s[i]!=s[j],这时我们可以通过对于端点元素的增减来达到以第一种情况

          ans[i][j]=min(ans[i][j],min(ans[i][j]+min(val[s[j]-'0'],del[s[j]-'0']),ans[i+1][j]+min(val[s[i]-'0'],del[s[i]-'0'])));

      最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s[2010];
int ans[2010][2010];
int val[200];
int del[220];
char a[10];
int v,d;
int main()
{int n,m;scanf("%d%d",&n,&m);scanf("%s",s+1);for(int i=1;i<=n;i++){scanf("%s%d%d",a+1,&v,&d);int middle=a[1]-'0';val[middle]=v;del[middle]=d;}memset(ans,0x3f,sizeof(ans));for(int i=1;i<=m;i++){ans[i][i]=0;}for(int len=2;len<=m;len++){for(int i=1;i<=m;i++){if(i+len-1>m) break;if(s[i]==s[i+len-1]){if(len==2) ans[i][i+len-1]=0;ans[i][i+len-1]=min(ans[i][i+len-1],ans[i+1][i+len-2]);}ans[i][i+len-1]=min(ans[i][i+len-1],min(ans[i][i+len-2]+min(val[s[i+len-1]-'0'],del[s[i+len-1]-'0']),ans[i+1][i+len-1]+min(val[s[i]-'0'],del[s[i]-'0'])));}}printf("%d\n",ans[1][m]);return 0;
}

    小结:这个题于端点的处理是很细腻的。

      在写这个恐怖的转移方程时注意换行,在逗号和分号都是可以换行的。

      len==2时需要特判qwq

转载于:https://www.cnblogs.com/ShuraK/p/8520582.html

[poj3280]Cheapest Palindrome_区间dp相关推荐

  1. poj3280 Cheapest Palindrome(回文串区间dp)

    https://vjudge.net/problem/POJ-3280 猛刷简单dp第一天第三题. 这个据说是[求字符串通过增减操作变成回文串的最小改动次数]的变体. 首先增减操作的实质是一样的,所以 ...

  2. 动态规划 —— 区间 DP

    [概述] 区间型动态规划,又称为合并类动态规划,是线性动态规划的扩展,它在分阶段地划分问题时,与阶段中元素出现的顺序和由前一阶段的区间中哪些元素合并而来有很大的关系. [思想] 区间 DP 实质上就是 ...

  3. 区间DP例题(持续更新)

    区间DP例题(持续更新) 做了这几道题之后发现基本的区间dp其实也就是那回事: 找出状态方程(基本上都长的差不多),然后用递推思维由小区间求得大区间: 可能某些问题会有些其他处理,只需要稍微改下就行了 ...

  4. POJ 2955 Brackets (区间DP)

    题目链接:http://poj.org/problem?id=2955 Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  5. 0x53. 动态规划 - 区间DP(习题详解 × 8)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 文章目录 0x53. 动态规划 - 区间DP Problem A. 最优矩阵链乘 Problem B. ...

  6. UVA1626 括号序列 Brackets sequence(区间DP匹配括号,输出匹配方案)

    整理的算法模板合集: ACM模板 UVA1626 Brackets sequence 我们将正规括号序列定义如下: 空序列是正规括号序列. 如果 SSS 是一个正规括号序列,那么 (S) 和 [S] ...

  7. UVA10003 切木棍 Cutting Sticks(区间DP、细节)

    整理的算法模板合集: ACM模板 本题其实就是一个区间DP 的模板题,总长度为len,有n个切割点,也就是说能被切割成n+1段,所以左边界是0,有边界是n + 1,所以答案就是f[0][n + 1]. ...

  8. 【动态规划】区间DP - 最优矩阵链乘(另附POJ1651Multiplication Puzzle)

    最优矩阵链乘(动态规划) 一个n∗mn*mn∗m的矩阵由 nnn 行 mmm 列共 n∗mn*mn∗m 排列而成.两个矩阵A和B可以相乘当且仅当A的列数等于B的行数.一个nm的矩阵乘mp的矩阵,运算量 ...

  9. 【每日DP】day13、P3147 [USACO16OPEN]262144 (区间DP,2048游戏)难度⭐⭐⭐★

    P3147 [USACO16OPEN]262144 P 想到合并,自然就想到区间dp,一个被合成的数之前是一个区间,并且由两个数比它小 111 的区间合成.可麻烦的是,我们并不知道之前的两个区间长度各 ...

最新文章

  1. AlertDialog的使用(二):分别创建
  2. java arraycollection_Java集合(三)--Collection、Collections和Arrays
  3. android关机菜单修改,Android4.4关机菜单添加重启系列选项
  4. [SPP-NET]Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
  5. python基础100_python基础100题
  6. 杂记 - 进化成更好的人
  7. GB-T 16260.1-2006 软件工程 产品质量
  8. java powermockrunner_java – PowerMock从@RunWith(PowerMockRunner.class)注释中抛出异常
  9. LeetCode 53最大子序和
  10. pytorch---模型加载与保存(5)使用在不同模型参数下的热启动模式
  11. combobox 属性、事件、方法
  12. matlab对5个矩阵循环求均值,MATLAB循环求数组的平均值 每隔几个数据求一下平均值...
  13. matlab世界坐标系转化,坐标变换_世界坐标系与用户坐标系之间的转换
  14. Arduino蜂鸣器唱曲天空之城
  15. 28 篇论文、6 大主题带你一览 CVPR 2020 研究趋势
  16. 苹果处理器排行_最新 iOS 性能排行榜,你的设备落伍了吗?
  17. Docker的安装以及解决启动失败问题
  18. C++ opengl 漫反射和镜面反射参数
  19. ArcGIS 图层上点的编辑
  20. python 接收外部参数_python 接收处理外带的参数方法

热门文章

  1. 从新获取jar_SpringBoot配置文件放在jar外部
  2. minheight能继承吗_遗嘱中的房屋被拆迁,指定继承人能继承对应的拆迁款或安置房吗?...
  3. python循环一段代码_Python循环语句代码详解:while、for、break
  4. 设备 esp32_「ESP 教程」ESP32 如何运行 TensorFlow 模型
  5. mysql 5.6 密码_Mysql5.6 忘记root密码的解决办法
  6. HBase——集群搭建
  7. idea右键单击没有 svn选项处理办法
  8. 【带着canvas去流浪(5)】绘制K线图
  9. 纳尼?我的Gradle build编译只要1s
  10. spring session的生命周期