ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

POJ3280 Cheapest Palindrome 区间DP

2019-04-06 09:53:04  阅读:277  来源: 互联网

标签:ch Cheapest int fix min vl char Palindrome DP


好久不做DP了。。。

题意:求原串通过删除和添加某些字符构成回文串的最小代价

设f[i][j]表示i到j位匹配的最小代价,那么有

f[i][j]=Inf;
if(ch[i]==ch[j]) f[i][j]=f[i+1][j-1];
f[i][j]=min(f[i][j],f[i][j-1]+min(vl[ch[j]][1],vl[ch[j]][0]));
f[i][j]=min(f[i][j],f[i+1][j]+min(vl[ch[i]][1],vl[ch[i]][0]));    

其中vl[char][0/1]表示添加或删除char 的代价

#include<cstdio>
#include<iostream>
#define R register int
const int Inf=0x3f3f3f3f;
using namespace std;
inline int g() {
    R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
    do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
}
int n,m,f[2010][2010];
int vl[128][2];
char ch[2010];
signed main() {
    n=g(),m=g();
    for(R i=1;i<=m;++i) ch[i]=getchar();
    for(R i=1;i<=n;++i) {
        register char ch;
        while(!isalpha(ch=getchar()));
        vl[(int)ch][0]=g(),vl[(int)ch][1]=g();
    }
    //for(R i='a';i<='z';++i) cout<<vl[i][0]<<" "<<vl[i][1]<<endl;
    for(R l=2;l<=m;++l) for(R i=1,j=l;j<=m;++i,++j) {
        f[i][j]=Inf;
        if(ch[i]==ch[j]) f[i][j]=f[i+1][j-1];
        f[i][j]=min(f[i][j],f[i][j-1]+min(vl[ch[j]][1],vl[ch[j]][0]));
        f[i][j]=min(f[i][j],f[i+1][j]+min(vl[ch[i]][1],vl[ch[]][0]));    
    } printf("%d\n",f[1][m]);
}

2019.04.06

标签:ch,Cheapest,int,fix,min,vl,char,Palindrome,DP
来源: https://www.cnblogs.com/Jackpei/p/10660860.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有