[CF1096D Easy Problem]
Code
#include<bits/stdc++.h>
#define rep(i,a,b) for(ll i=(a);i<=(b);i++)
#define ll long long
using namespace std;
const ll N=1e5+100;
ll f[N][10],a[N],n;
char ch[N];
string s="hard";
int main()
{
scanf("%lld",&n);
scanf("%s",ch+1);
rep(i,1,n)scanf("%d",&a[i]);
memset(f,0x3f,sizeof(f));
rep(i,1,4)f[0][i]=0;
rep(i,1,n){
rep(j,1,4){
if(ch[i]==s[j-1])f[i][j]=min(f[i-1][j-1],f[i-1][j]+a[i]);
else f[i][j]=min(f[i][j],f[i-1][j]);
}
}
cout<<min(min(f[n][4],f[n][1]),min(f[n][2],f[n][3]));
return 0;
}
- f[i][j]表示到了字符串的第i位,不能与"hard"的第j位及以前形成匹配的最小花费