1710: [Usaco2007 Open]Cheappal 廉价回文

来源:互联网 发布:sql 删除表中行 编辑:程序博客网 时间:2024/06/04 18:03

题目链接

题目大意:给出删掉和添加每种字符的花费,求把字符串变成回文串的最小花费

题解:加入一个字母等价于在对称位置删除一个字母,所以费用取较小的就可以

然后根据知识知道回文串一般在串两边进行操作,据此大力转移

我的收获:……

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int M=2005;int n,m,f[M][M],cost[255];char str[M];int dfs(int l,int r){    if(r<1||l>m) return 0;    if(l==r) return 0;    if(f[l][r]!=-1) return f[l][r];    int res=1000000;    res=min(dfs(l+1,r)+cost[str[l]],dfs(l,r-1)+cost[str[r]]);    if(str[l]==str[r]) res=min(res,dfs(l+1,r-1));    return f[l][r]=res;}void work(){    memset(f,-1,sizeof(f));    printf("%d\n",dfs(1,m));}void init(){    char tmp[50];int w1,w2;    scanf("%d%d%s",&n,&m,str+1);    for(int i=1;i<=n;i++)    {        scanf("%s%d%d",tmp,&w1,&w2);        cost[tmp[0]]=min(w1,w2);    }}int main(){    init();    work();    return 0;}
原创粉丝点击