题目链接:http://poj.org/problem?id=3280

题目大意:给定一个字符串,可以删除增加,每个操作都有代价,求出将字符串转换成回文串的最小代价

Sample Input

3 4
abcb
a 1000 1100
b 350 700
c 200 800

Sample Output

900

分析:这是一道最长回文串的变形,就是LCS

  一串字符要变成回文,对于一个字符来说,删掉它,或者增加对称的一个该字符,都能达到回文的效果,所以是等价的。所以取代价的的时候选择最小的就可以。

  至于动态规划方程:令dp[i][j]表示从第 i 个字符到第j个字符变成回文的最小代价,初始为0。接着LCS

dp[i][j] = min(dp[i+1][j]+cost[s[i]-'a'] , dp[i][j-1]+cost[s[j]-'a']) ;                if(s[i]==s[j])  dp[i][j] = min(dp[i+1][j-1],dp[i][j]);

代码如下:

 1 # include<stdio.h>
 2 # include<string.h>
 3 # define maxn 2005
 4 char s[maxn];
 5 int dp[maxn][maxn],cost[maxn];
 6
 7 int min(int a,int b){
 8     return a<b ? a :b;
 9 }
10
11 int main(){
12     int n,m,a,b,i,j;
13     char temp;
14     while(scanf("%d%d",&n,&m)!=EOF){
15         memset(dp,0,sizeof(dp));
16         getchar();
17         scanf("%s",s+1);
18         getchar();
19         for(i=1;i<=n;i++){
20             scanf("%c %d%d",&temp,&a,&b);
21             getchar();
22             cost[temp-'a'] = min(a,b);
23         }
24         for(j=1;j<=m;j++){
25             for(i=j+1;i>=1;i--){
26                 dp[i][j] = min(dp[i+1][j]+cost[s[i]-'a'] , dp[i][j-1]+cost[s[j]-'a']) ;
27                 if(s[i]==s[j])
28                     dp[i][j] = min(dp[i+1][j-1],dp[i][j]);
29             }
30         }
31         printf("%d\n",dp[1][m]);
32     }
33     return 0;
34 }

转载于:https://www.cnblogs.com/acm-bingzi/p/3280090.html

POJ 3280 Cheapest Palindrome(DP 回文变形)相关推荐

  1. POJ 3280 Cheapest Palindrome(DP)

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

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

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

  3. POJ 3280 Cheapest Palindrome

    题目链接 题意 给定一个字符串,和修改每个字母(增加或删除)的花费,问最少花费使得构成回文串 AC 区间dp dp[ i ][ j ] 表示区间(i,j)最小的花费,从小区间推到大区间 两种情况: s ...

  4. 动态规划 53:Maximum Subarray,152:Maximum Subarray,266. Palindrome Permutation 回文全排列...

    题意:寻找子数组的和最大. 思路:设置dp数组来保存到第i位的最大和. 判断第i-1位的正负,若dp[i-1]<0 则 dp[i] = nums[i]; 若 dp[i-1] > 0 则 d ...

  5. C++palindrome partitioning回文分割算法的实现(附完整源码)

    C++palindrome partitioning回文分割算法的实现 C++palindrome partitioning回文分割算法的实现的完整源码(定义,实现,main函数测试) C++pali ...

  6. CodeForces - 932G Palindrome Partition(回文自动机+Palindrome Series优化dp)

    题目链接:点击查看 题目大意:给出一个长度为偶数的字符串,问将其分割成 k 个子串记为 a[ 1 ] , a[ 2 ] ... a[ k ] ,且满足 a[ i ] == a[ k - i + 1 ] ...

  7. poj 3280(简单区间dp)

    题意:将一个字符串转换成回文串的最小花费. 解题思路:简单的区间dp,dp[i][j]表示从i到j的字符串转换成回文串的最小化费. #include<iostream> #include& ...

  8. POJ2402 Palindrome Numbers 回文数

    题目链接: http://poj.org/problem?id=2402 题目大意就是让你找到第n个回文数是什么. 第一个思路当然是一个一个地构造回文数直到找到第n个回文数为止(也许大部分人一开始都是 ...

  9. 【CodeForces - 798A】Mike and palindrome (回文串,水题,字符串问题)

    题干: Mike has a string s consisting of only lowercase English letters. He wants to change exactly one ...

最新文章

  1. Linux的目录结构与目录管理
  2. 添加错误debug信息
  3. delphi7 获取dll的类_跟我学Java内存管理----JMM精华终章(类加载器)
  4. 关于如何在word中写公式的方法
  5. 【英语学习】【Level 07】U03 Amazing wonders L4 The Qin Dynasty legacy
  6. 安装cocoaPod 的问题
  7. 软件测试第五周 - 编码的 UI 测试
  8. hashmap初试数组大小为什么一定要是2 的倍数
  9. JS中this的四种调用方法
  10. Win10家庭版使用gpedit.msc方法
  11. sns.pairplot()用法
  12. 【深度学习环境配置二】【Pytorch安装详解-内附下载链接】基于win 10+TITAN XP+CUDA11.1+python3.7+vs2019的pytorch安装
  13. 金融去杠杆环境下,请聆听麦子金服财富投资者给出的答案
  14. 四极管:京东物流“后牌照”战略:8月底开放 或分拆
  15. Qt WA_TranslucentBackground 导致视频渲染不了的问题
  16. 专业测评:iphone7致命缺陷曝光
  17. java生成word 可变表格_【java】Freemarker 动态生成word(带图片表格)
  18. High work stress makes you feel anxiety and it can lead you ill
  19. 2022年全球及中国公务汽车轮胎行业头部企业市场占有率及排名调研报告
  20. 家里光猫用管理员权限登录

热门文章

  1. STM32开发 -- Ublox GPS之设置PUBX
  2. S5PV210开发 -- 串口驱动开发
  3. 数据结构与算法 -- 链表
  4. Java之什么是序列化以及为什么要序列化
  5. 【译】Blockchain-based Machine Learning Marketplaces
  6. 挖洞经验 | 看我如何发现“小火车托马斯”智能玩具APP聊天应用漏洞
  7. android锁屏唤醒并解锁屏幕
  8. RUNNING JUPYTER NOTEBOOKS ON A REMOTE SERVER VIA SSH
  9. 微信自动回复和自动抢红包实现原理(三):自动抢红包
  10. java使用keystore认证过程(license认证)