【BZOJ】1710: [Usaco2007 Open]Cheappal 廉价回文
2017-09-26 10:15
417 查看
【算法】区间DP
【题解】回文问题的套路做法:区间DP。
f[i][j]表示区间i~j回文的最小代价,则有f[i][j]=min{①②③}。
①f[i+1][j]+min(a[s[i]],b[s[i]])
②f[i][j-1]+min(a[s[j]],b[s[j]])
③f[i+1][j-1],s[i]==s[j]
注意初始化,f[i][i]=f[i][i+1]=f[i+1][i]=0,偶数回文时初始状态会交错。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=2010; int n,m,s[maxn],a[30],f[maxn][maxn]; char ss[maxn]; int main(){ scanf("%d%d%s",&n,&m,ss+1); for(int i=1;i<=m;i++)s[i]=ss[i]-'a'; int b,c; for(int i=1;i<=n;i++){ scanf("%s",ss+1); scanf("%d%d",&b,&c); a[ss[1]-'a']=min(b,c); } memset(f,0x3f,sizeof(f)); for(int i=1;i<=m;i++)f[i][i]=0,f[i][i+1]=f[i+1][i]=0;// for(int p=2;p<=m;p++){ for(int i=1;i<=m-p+1;i++){ int j=i+p-1; f[i][j]=min(f[i+1][j]+a[s[i]],f[i][j-1]+a[s[j]]); if(s[i]==s[j])f[i][j]=min(f[i][j],f[i+1][j-1]); } } printf("%d",f[1][m]); return 0; }View Code
相关文章推荐
- BZOJ 1710: [Usaco2007 Open]Cheappal 廉价回文 区间dp
- BZOJ 1710: [Usaco2007 Open]Cheappal 廉价回文
- 【BZOJ1710】[Usaco2007 Open]Cheappal 廉价回文【区间DP】
- bzoj1710【Usaco2007 Open】Cheappal 便宜回文
- BZOJ1710: [Usaco2007 Open]Cheappal 廉价回文
- bzoj1710[Usaco2007 Open]Cheappal 廉价回文 dp
- bzoj 1710: [Usaco2007 Open]Cheappal 廉价回文 动态规划
- bzoj1710【Usaco2007 Open】Cheappal 廉价回文
- 1710: [Usaco2007 Open]Cheappal 廉价回文
- bzoj 1710: [Usaco2007 Open]Cheappal 廉价回文【区间dp】
- 动态规划 BZOJ1710 [Usaco2007 Open]Cheappal 廉价回文
- 1710: [Usaco2007 Open]Cheappal 廉价回文 (区间DP)
- 1710: [Usaco2007 Open]Cheappal 廉价回文
- BZOJ 1711: [Usaco2007 Open]Dingin吃饭
- bzoj 1711: [Usaco2007 Open]Dining吃饭
- bzoj 1711: [Usaco2007 Open]Dining吃饭 网络流
- BZOJ 1647: [Usaco2007 Open]Fliptile 翻格子游戏 Dfs
- bzoj 1646: [Usaco2007 Open]Catch That Cow 抓住那只牛【bfs】
- bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线【线段树+hash】
- Bzoj1711 [Usaco2007 Open]Dining吃饭