标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。