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

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

给一个字符串

可以再任意位置添加或删除字母(给出花费的) 使得字符串变成回文

思路:

其实添加和删除的性质是一样的

添加一个字母和删去相对应的字母 对于使原文变成回文

的贡献是一样的 所以我们取花费的时候 只取小的花费

为了理解方面统一用删除吧

从两端进行遍历

1 如果对应相等 则直接去掉就可以  (无需花费)

2 如果只有一个字符了 直接去掉 (无需花费)

3 否则选择删掉左边 和 删掉右边 两种情况中最优的(只有给出花费才能删)

代码及其注释:

#include
#include
#include
#include
using namespace std;const int N=2005;char s[N];int cost[27];int ans[N][N];//在l 到 r 区间变成回文的最小花费int dp(int l,int r){ if(ans[l][r]!=-1)//记忆化搜索 return ans[l][r]; if(l==r)//只有一个字符 { ans[l][r]=0; return ans[l][r]; } if(s[l]==s[r])//左右相等 { if(l+1==r) ans[l][r]=0; else ans[l][r]=dp(l+1,r-1); return ans[l][r]; } ans[l][r]=min(cost[s[l]-'a']+dp(l+1,r),dp(l,r-1)+cost[s[r]-'a']);//两种情况选最优 return ans[l][r];}int main(){ int n,m; while(scanf("%d %d",&n,&m)!=EOF) { scanf("%s",s); memset(cost,-1,sizeof(cost)); while(n--) { char c; int v1,v2; getchar(); scanf("%c %d %d",&c,&v1,&v2); cost[c-'a']=min(v1,v2); } memset(ans,-1,sizeof(ans)); printf("%d\n",dp(0,m-1)); } return 0;}

  

转载于:https://www.cnblogs.com/liulangye/archive/2012/07/18/2598160.html

你可能感兴趣的文章
【算法】—— 随机音乐的播放算法
查看>>
mysql asyn 示例
查看>>
数据库第1,2,3范式学习
查看>>
《Linux内核设计与实现》第四章学习笔记
查看>>
使用iperf测试网络性能
查看>>
图片的显示隐藏(两张图片,默认的时候显示第一张,点击的时候显示另一张)...
查看>>
Docker 安装MySQL5.7(三)
查看>>
python 模块 来了 (调包侠 修炼手册一)
查看>>
关于CSS的使用方式
查看>>
分析语句执行步骤并对排出耗时比较多的语句
查看>>
原生JS轮播-各种效果的极简实现
查看>>
计数器方法使用?
查看>>
带你全面了解高级 Java 面试中需要掌握的 JVM 知识点
查看>>
sonar结合jenkins
查看>>
解决VS+QT无法生成moc文件的问题
查看>>
AngularJs练习Demo14自定义服务
查看>>
关于空想X
查看>>
CF1067C Knights 构造
查看>>
[BZOJ2938] 病毒
查看>>
webstorm修改文件,webpack-dev-server不会自动编译刷新
查看>>