https://codeforces.com/contest/1096/problem/D

题意

给一个串s,删掉一个字符的代价为a[i],问使得s的子串不含"hard"的最小代价

题解

  • 定义\(dp[i][j]\)为到第i位下一个将要匹配j的最小代价

    • \(若s[i]==t[j]\)

      • 删掉:\(min(dp[i+1][j],dp[i][j]+a[i])\)
      • 不删,若j<3:\(min(dp[i+1][j+1],dp[i][j])\)
    • \(若s[i]!=t[j]\)
      • 不用删:\(min(dp[i+1][j],dp[i][j])\)
  • \(ans=min(dp[n][i]),0 \leq i \leq 3\)

代码

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define MAXN 100005
using namespace std;
ll dp[MAXN][4],a[MAXN],ans;
int n;string s;
int main(){
cin>>n>>s;
memset(dp,inf,sizeof(dp));
for(int i=0;i<n;i++)scanf("%lld",&a[i]);
string t="hard";
dp[0][0]=0;
for(int i=0;i<n;i++){
for(int j=0;j<4;j++){
if(dp[i][j]==inf)continue;
if(s[i]==t[j]){
dp[i+1][j]=min(dp[i+1][j],dp[i][j]+a[i]);
if(j<3)dp[i+1][j+1]=min(dp[i+1][j+1],dp[i][j]);
}else{
dp[i+1][j]=min(dp[i+1][j],dp[i][j]);
}
}
}
ans=1e18;
for(int i=0;i<4;i++)ans=min(ans,dp[n][i]);
cout<<ans;
}

最新文章

  1. 1.ASP.NET MVC使用EPPlus,导出数据到Excel中
  2. KVC&amp;&amp;&amp;KVO
  3. 【Windows】用信号量实现生产者-消费者模型
  4. Linux上安装oracle客户端及sqlldr
  5. WingIDE中文乱码问题解决方法
  6. IOS学习笔记(四)之UITextField和UITextView控件学习
  7. 《Programming WPF》翻译 第8章 5.创建动画过程
  8. spoj 3871 gcd extreme
  9. LeetCodeOJ. Maximum Depth of Binary Tree
  10. javaSE_06Java中的数组(array)-提高练习
  11. Java自定义注解及使用
  12. 全面理解 javascript 的 argements caller callee call apply 之caller
  13. luogu P3605 [USACO17JAN]Promotion Counting晋升者计数
  14. 使用GitHub-Pages创建博客和图片上传问题解决
  15. FNDLOAD移植Lookup Type
  16. 过度使用DBLINK做系统集成会带来的问题
  17. (转)MySQL 线程池内幕
  18. Gcc\MingW\Cygwin\Msys简介
  19. HDU 4280Island Transport(网络流之最大流)
  20. (转自)视频流中的DTS/PTS到底是什么;

热门文章

  1. (二十七)golang-排序和查找
  2. kettle文件输入 通配符匹配多个文件
  3. js生成条形码
  4. git 给分支添加描述 管理分支实用方法
  5. MS14-068域提权漏洞复现
  6. HTML教程详解
  7. ArcGIS Server JavaScript API中ESRI字体下载
  8. Java学习——枚举类
  9. Flask--数据库连接池
  10. Flask--g属性