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