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