关闭

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

标签: ini
1771人阅读 评论(2) 收藏 举报
分类:

题目大意 :

给定一个长度为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;
}

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:347901次
    • 积分:4229
    • 等级:
    • 排名:第7159名
    • 原创:117篇
    • 转载:3篇
    • 译文:0篇
    • 评论:118条
    最新评论