【算法】区间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 ;
}

最新文章

  1. 再探banana
  2. .deb包的安装方法
  3. Tween.js的使用示例
  4. coderforces 721b
  5. 大型网站一致性的基础理论---CAP/BASE
  6. C# 无边框窗体边框阴影效果
  7. aidl 中通过RemoteCallbackList 运用到的回调机制: service回调activity的方法
  8. shelve模块
  9. 2.1.6 用ProtectX实现扫描的反击与追踪
  10. virsh VMI deploy data serial xml
  11. Markov不等式,Chebyshev不等式
  12. C / C++ 运行环境搭建教程
  13. AngularJS进阶(十五)Cookie &#39;data&#39; possibly not set or overflowed because it was too large
  14. 金蝶K3外购入库单单价取数规则调整
  15. 2018—自学Selenium+Python 笔记(一)
  16. numpy统计分布显示
  17. Ztree的onClick和onCheck事件
  18. 【渗透技术】渗透测试技术分析_TomCat
  19. Java和Php比较
  20. qtp 自动货测试桌面程序-笔记(使用函数)

热门文章

  1. Python学习 - 入门篇1
  2. TCP系列38—拥塞控制—1、概述
  3. JDK源码分析 – ArrayList
  4. YaoLingJump开发者日志(三)
  5. Delphi实现在数据库中存取图像
  6. 【Python】Python 过滤列表
  7. 【python】windows7下怎样安装whl
  8. Python爬取B站视频信息
  9. CentOS 安装tomcat
  10. bzoj 1877: [SDOI2009]晨跑 (网络流)