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;
}

相关文章推荐

Java笔试面试题整理第五波

转载至:http://blog.csdn.net/shakespeare001/article/details/51321498作者:山代王(开心阳)本系列整理Java相关的笔试面试知识点,其他几篇文...

Simplify Path

【题目】 Given an absolute path for a file (Unix-style), simplify it. For example, path = "...
  • haihaa
  • haihaa
  • 2016年05月09日 15:42
  • 134

【POJ 3280】 Cheapest Palindrome(动态规划 回文串)

     题意:现在有一个由n个字符组成的长度为m的字符串,可以对其通过增加字符或者删除字符来使其变成回文字符串,而增加或者删除字符都有一个花费,求解使该字符串变成回文所进行操作的最小花费.    用...

Palindrome (动态规划) 构成回文串

F - Palindrome Time Limit:3000MS    Memory Limit:65536KB     64bit IO Format:%I64d & %I64u   D...

poj 1159 Palindrome -- 回文串,动态规划

Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 59029   Ac...

构造回文(动态规划,递归算法)

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。 输入数据有多组,每组包含一个字符串s,且保证:1...

UVA 10739 String to Palindrome (增删字符将非回文串串变身回文串,动态规划dp )

H - String to Palindrome Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu ...

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

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

动态规划求最小代价矩阵链相乘

动态规划-求最小代价矩阵链相乘

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

91. Minimum Adjustment Cost 【题目】 Given an integer array, adjust each integers so that the differen...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Cheapest Palindrome - 最小代价构造回文 动态规划
举报原因:
原因补充:

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