poj之旅——3280
来源:互联网 发布:海盗船水冷控制软件 编辑:程序博客网 时间:2024/05/29 05:02
题目描述:字串S长M,由N个小写字母构成。欲通过增删字母将其变为回文串,增删特定字母花费不同,求最小花费
题解:定义dp[i][j]表示将原字串s的子字串s[i…j]变换成回文的最小花费则有:
f[i][j]=min(f[i+1][j]+cost[s[i]-'a'],f[i][j-1]+cost[s[j]-'a']); if (s[i]==s[j])f[i][j]=min(f[i][j],f[i+1][j-1]);
(注意此处的可以增加也可以删除是个局,取其花费最小值即可。因为如果在首尾增删字母x都可以使一个字串s[i…j]变成回文的话,当然选取花费小的)
参考程序:
#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<cstdlib>using namespace std;int cost[32];int f[2048][2048];int main(){ int n,m; cin>>n>>m; string s; cin>>s; for (int i=0;i<n;i++){ char c; int add,del; cin>>c>>add>>del; cost[c-'a']=min(add,del); } for (int i=m-1;i>=0;i--){ for (int j=i+1;j<m;j++){ f[i][j]=min(f[i+1][j]+cost[s[i]-'a'],f[i][j-1]+cost[s[j]-'a']); if (s[i]==s[j])f[i][j]=min(f[i][j],f[i+1][j-1]); } } printf("%d",f[0][m-1]); return 0;}
0 0
- poj之旅——3280
- poj之旅——3258
- poj之旅——3273
- poj之旅——3104
- poj之旅——3045
- poj之旅——2976
- poj之旅——3111。
- poj之旅——3579
- poj之旅——1979
- poj之旅——3009
- poj之旅——3669
- poj之旅——2718
- poj之旅——3187
- poj之旅——3050
- poj之旅——2376
- poj之旅——1328
- poj之旅——3190
- poj之旅——2393
- 这是我的第一篇博客
- 解决Eclipse中文乱码
- Android ListView 点击事件无法获得焦点简析
- 数组——蛇形矩阵、螺旋矩阵
- Ehcache详细解读
- poj之旅——3280
- Android自定义控件(含简单栗子)
- 第12周-项目1(3)
- Java序列化与反序列化
- EXC_BAD_ACCESS on UIAlertview code=1
- JS调试必备的5个debug技巧
- Java EnumMap工作原理及实现(二)
- 【数据结构】 栈和队列 YTU 2241: 相同序列(栈和队列)
- LoadRunner调用Dll