http://codeforces.com/problemset/problem/1096/D
当时也不知道WA哪了,重写一遍这道题就过了
f[i][1]表示到i为止 h不能出现的最小代价
f[i][2] 表示ha不能出现
f[i][3] 表示har
f[i][4]表示hard
那么如果当前出现了一个s[i]='r',那么f[i][3]要么需要把这一位去掉,代价+w[i],要么直接f[i-1][2]转移过来,因为如果没有ha,那么har也不会存在。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxl 100010
using namespace std;
const long long inf=1ll<<61;
int n;
long long ans;
long long w[maxl];
long long f[maxl][6];
char s[maxl];
inline void prework()
{
scanf("%s",s+1);
for(int i=1;i<=n;i++)
scanf("%lld",&w[i]);
memset(f,0x3f,sizeof(f));
}
inline void mainwork()
{
f[0][0]=0;
for(int i=0;i<=4;i++)
f[0][i]=0;
for(int i=1;i<=n;i++)
{
f[i][0]=0;
if(s[i]=='h')
f[i][1]=f[i-1][1]+w[i];
else
f[i][1]=f[i-1][1];
if(s[i]=='a')
f[i][2]=min(f[i-1][1],f[i-1][2]+w[i]);
else
f[i][2]=f[i-1][2];
if(s[i]=='r')
f[i][3]=min(f[i-1][2],f[i-1][3]+w[i]);
else
f[i][3]=f[i-1][3];
if(s[i]=='d')
f[i][4]=min(f[i-1][3],f[i-1][4]+w[i]);
else
f[i][4]=f[i-1][4];
}
}
inline void print()
{
ans=inf;
for(int i=1;i<=4;i++)
ans=min(ans,f[n][i]);
printf("%lld\n",ans);
}
int main()
{
while(~scanf("%d",&n))
{
prework();
mainwork();
print();
}
return 0;
}