博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3280 Cheapest Palindrome
阅读量:5235 次
发布时间:2019-06-14

本文共 1236 字,大约阅读时间需要 4 分钟。

题意:给你m个字符,其中有n种字符,每种字符都有两个值,分别是增加一个这样的字符的代价,删除一个这样的字符的代价,让你求将原先给出的那串字符变成回文串的最小代价。

思路:区间DP,dp[i][j]代表将区间[i,j]变为回文串的最小代价。

#include 
#include
#include
#include
#include
#include
#include
#define MAXSIZE 2005#define LL long long#define INF 0x3f3f3f#define mod 10056using namespace std;/*给你m个字符,其中有n种字符,每种字符都有两个值,分别是增加一个这样的字符的代价,删除一个这样的字符的代价,让你求将原先给出的那串字符变成回文串的最小代价。*/int dp[MAXSIZE][MAXSIZE],a[MAXSIZE],add[MAXSIZE],red[MAXSIZE],n,m;char s[MAXSIZE];int Solve(){ memset(dp,0,sizeof(dp)); for(int i=m-1;i>=1;i--) { for(int j=i+1;j<=m;j++) { dp[i][j] = min(dp[i+1][j] + add[s[i]-'a'],dp[i+1][j] + red[s[i]-'a']); //删除s[i]或增加s[i] dp[i][j] = min(dp[i][j],dp[i][j-1] + red[s[j]-'a']);//删除s[j] dp[i][j] = min(dp[i][j],dp[i][j-1] + add[s[j]-'a']);//增加s[j] if(s[i] == s[j]) dp[i][j] = min(dp[i][j] ,dp[i+1][j-1]); } } return dp[1][m];}int main(){ char ch[1]; while(scanf("%d%d",&n,&m)!=EOF) { scanf("%s",s+1); for(int i=1;i<=n;i++) { scanf("%s",ch); scanf("%d%d",&add[(ch[0]-'a')],&red[(ch[0]-'a')]); } int ans = Solve(); printf("%d\n",ans); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/alan-W/p/7647542.html

你可能感兴趣的文章
VMware12 + Ubuntu16.04 虚拟磁盘扩容
查看>>
水平垂直居中
查看>>
MySQL简介
查看>>
设计模式之桥接模式(Bridge)
查看>>
jquery的$(document).ready()和onload的加载顺序
查看>>
Python Web框架Django (五)
查看>>
.net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串------(转)...
查看>>
【codevs1033】 蚯蚓的游戏问题
查看>>
【程序执行原理】
查看>>
python的多行注释
查看>>
连接Oracle需要jar包和javadoc文档的下载
查看>>
UVA 10976 - Fractions Again?!
查看>>
Dreamweaver cc新版本css单行显示
查看>>
【android】安卓的权限提示及版本相关
查看>>
JavaScript可否多线程? 深入理解JavaScript定时机制
查看>>
IOS基础学习
查看>>
PHP 导出 Excell
查看>>
Java基础教程——网络基础知识
查看>>
自己到底要的是什么
查看>>
Kruskal基础最小生成树
查看>>