Cheapest Palindrome - 最小代价构造回文 动态规划

原创 2007年09月28日 23:19:00

题目大意 :

给定一个长度为M(<=2000)字符串(小写字母),要求删除或添加一些字母,使得该字符串成为回文。

每种字母删除或添加的代价都是不同的。要求输出最小的代价。

 

动态规划可以解决。

令f[i][j]表示原字符串从i到j已经通过某种方式处理成为回文的最小代价。

初始f[i][i]=0;

转移方程 f[i][j]=min{ f[i+1][j]+add[i] ; f[i+1][j]+del[i] ;  f[i][j-1]+add[j] ; f[i][j-1]+del[j] ; f[i+1][j-1](if a[i]==a[j])  }

错了好几次 原因是程序中定义的“无穷大”太小>_<

源代码:

/*
H - Cheapest Palindrome
*/

#include <stdio.h>
#define M 2002
#define N 30

int f[M][M]={0};
   
int main()
{
    int i,j,k,m,n,s,t;
    char a[M],st[N];
    int del[N]={0},ins[N]={0};

    //input
    scanf("%d%d",&n,&m);
    scanf("%s",a);
    for(i=0;i<n;i++)
    {
        scanf("%s",st);
        scanf("%d%d",&ins[st[0]-'a'],&del[st[0]-'a']);
    }
   
    //DP
    for(k=1;k<m;k++)
    {
        for(i=0;i<m-k;i++)
        {
            j=i+k;
            s=99999999;    /***/
            if(a[i]==a[j] && f[i+1][j-1] < s) s=f[i+1][j-1];
            if(f[i+1][j]+del[a[i]-'a'] < s) s=f[i+1][j]+del[a[i]-'a'];
            if(f[i][j-1]+del[a[j]-'a'] < s) s=f[i][j-1]+del[a[j]-'a'];
            if(f[i+1][j]+ins[a[i]-'a'] < s) s=f[i+1][j]+ins[a[i]-'a'];
            if(f[i][j-1]+ins[a[j]-'a'] < s) s=f[i][j-1]+ins[a[j]-'a'];
            //printf("k=%d: [%d - %d] = %d/n",k,i,j,s);
            f[i][j]=s;
        }
    }

    printf("%d/n",f[0][m-1]);
    return 0;
}

动态规划——回文最小分割数(palindrome-partitioning-ii)

题目: 给定一个字符串str,返回把str全部切成回文子串的最小分割数。 举例: str="ABA" ,不需要切割,返回0; str="ACDCDCDAD",最少需要切两次,比如"A"...
  • jingsuwen1
  • jingsuwen1
  • 2016年07月17日 21:06
  • 6683

动态规划算法,最小代价

int tempType;                 int cost = 0;                 if (aString.charAt(i - 1) != bString.cha...
  • shen332401890
  • shen332401890
  • 2015年06月22日 16:19
  • 1879

动态规划系列问题-最小编辑代价

最小编辑代价(最小编辑距离) 题目描述: 给定两个字符串str1和str2,再给定三个整数ic,dc,rc,分别代表插入、删除、替换一个字符的代价,返回将str1编辑成str2...
  • u013328850
  • u013328850
  • 2016年11月16日 16:22
  • 359

动态规划--最小调整代价

91. Minimum Adjustment Cost 【题目】 Given an integer array, adjust each integers so that the differen...
  • sinat_26230689
  • sinat_26230689
  • 2016年07月10日 22:12
  • 2012

最小编辑代价 动态规划

1、题目描述:来源于《算法与数据结构题目最优解》左程云著 给定两个字符串str1和str2,再给定三个整数ic、dc和rc,分别代表插入、删除和替换一个字符的代价,返回将str1编辑成str2的最小...
  • qq_34266990
  • qq_34266990
  • 2017年12月10日 21:30
  • 17

最小编辑代价(动态规划)

[编程题] 最小编辑代价 对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。...
  • chengonghao
  • chengonghao
  • 2016年08月10日 21:45
  • 470

poj 1159 Palindrome 动态规划的三种解法

区间dp[le][ri]直接求区间[le,ri]最少需要添加多少字符 1.未用滚动数组,会超内存 #include #include #include #include #include #in...
  • yskyskyer123
  • yskyskyer123
  • 2016年03月07日 13:51
  • 103

动态规划解最长回文子序列并优化空间复杂度

本文用动态规划的思想解决最长回文子序列问题,代码简介明了。之后再用很巧妙的方法把空间复杂度从O(n^2)降到O(n)。...
  • u012077163
  • u012077163
  • 2013年11月19日 01:07
  • 3192

动态规划:最长回文字符串

题目:请从一个已知的字符串中寻找最长回文字符串 解法1:动态规划 回文字符串的子串也是回文,比如P[i,j](表示以i开始以j结束的子串)是回文字符串,那么P[i+1,j-1]也是回文字符...
  • wangbaochu
  • wangbaochu
  • 2016年12月24日 19:47
  • 2232

最长回文子串(动态规划和递归)

给一个字符串,找出它的最长的回文子序列的长度。例如,如果给定的序列是“BBABCBCAB”,则输出应该是7,“BABCBAB”是在它的最长回文子序列。 “BBBBB”和“BBCBB”也都是该字符串的回...
  • weijinqian0
  • weijinqian0
  • 2016年04月04日 10:24
  • 2776
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Cheapest Palindrome - 最小代价构造回文 动态规划
举报原因:
原因补充:

(最多只允许输入30个字)