【BZOJ】1710: [Usaco2007 Open]Cheappal 廉价回文
2024-10-15 08:33:15
【算法】区间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=; int n,m,s[maxn],a[],f[maxn][maxn];
char ss[maxn];
int main(){
scanf("%d%d%s",&n,&m,ss+);
for(int i=;i<=m;i++)s[i]=ss[i]-'a';
int b,c;
for(int i=;i<=n;i++){
scanf("%s",ss+);
scanf("%d%d",&b,&c);
a[ss[]-'a']=min(b,c);
}
memset(f,0x3f,sizeof(f));
for(int i=;i<=m;i++)f[i][i]=,f[i][i+]=f[i+][i]=;//
for(int p=;p<=m;p++){
for(int i=;i<=m-p+;i++){
int j=i+p-;
f[i][j]=min(f[i+][j]+a[s[i]],f[i][j-]+a[s[j]]);
if(s[i]==s[j])f[i][j]=min(f[i][j],f[i+][j-]);
}
}
printf("%d",f[][m]);
return ;
}
最新文章
- 再探banana
- .deb包的安装方法
- Tween.js的使用示例
- coderforces 721b
- 大型网站一致性的基础理论---CAP/BASE
- C# 无边框窗体边框阴影效果
- aidl 中通过RemoteCallbackList 运用到的回调机制: service回调activity的方法
- shelve模块
- 2.1.6 用ProtectX实现扫描的反击与追踪
- virsh VMI deploy data serial xml
- Markov不等式,Chebyshev不等式
- C / C++ 运行环境搭建教程
- AngularJS进阶(十五)Cookie &#39;data&#39; possibly not set or overflowed because it was too large
- 金蝶K3外购入库单单价取数规则调整
- 2018—自学Selenium+Python 笔记(一)
- numpy统计分布显示
- Ztree的onClick和onCheck事件
- 【渗透技术】渗透测试技术分析_TomCat
- Java和Php比较
- qtp 自动货测试桌面程序-笔记(使用函数)