/*
translation:
给出一些字母的删除和添加的代价,求出让一串给定的字符串变成回文串的最小代价。
solution:
区间dp
d[i][j]:从i~j变成回文串的最小代价。具体转移方程见代码。
note:
1:转移方程错误。区间dp的转移方程形式上有点类似lcs,以后可以对比lcs来写区间dp的转移方程。
2:像回文,括号这些类似的问题有时候可以考虑用区间dp来解决!
date:
2016.9.1
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxm = 2001;
char str[maxm];
int dp[maxm][maxm]; //表示从i~j要形成回文串需要的最少花费
int n, m; //n个字符,m长度的串
int add[125], del[125]; //分别是字母i添加和删除的费用
int main()
{
//freopen("in.txt", "r", stdin);
while(cin >> n >> m) {
scanf("%s", str);
char c;
int a, b;
memset(add, 0, sizeof(add));
memset(del, 0, sizeof(del));
for(int i = 0; i < n; i++) {
cin >> c >> a >> b;
add[c] = a; del[c] = b;
}
memset(dp, 0, sizeof(dp));
for(int i = m - 1; i >= 0; i--) {
for(int j = i + 1; j < m; j++) {
if(str[i] == str[j]) dp[i][j] = dp[i + 1][j - 1];
else {
int t1 = dp[i][j - 1] + min(add[str[j]], del[str[j]]);
int t2 = dp[i + 1][j] + min(add[str[i]], del[str[i]]);
dp[i][j] = min(t1, t2);
}
}
}
printf("%d\n", dp[0][m - 1]);
}
return 0;
}
poj3280(区间dp)
最新推荐文章于 2021-08-12 16:23:05 发布