题解 CF1096D 【Easy Problem】
题目link:
Codeforces
luogu
unaccept的同学们
要开long long!
事实上此题就是dp,dp[i][j]表示前i个字符中清到‘hard’的第几个
状态转移方程:
if(S[i]!=hard[j])
{
dp[i][j]=dp[i-1][j];
}
else
{
dp[i][j]=min(dp[i-1][j-1],dp[i-1][j]+a[i]);
}
关于else里的转移方程:因为要破掉‘hard’,可以扔前面的,也可以灭当前这个
第一个方程就不用讲了吧
然后就可以到代码中理解了
#include<bits/stdc++.h>
using namespace std;
long long n,a[100010],dp[100010][10],ans;
char hard[5]={'\0','h','a','r','d'},S[100010];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>S[i];
}
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
memset(dp,0x7f,sizeof(dp));
for(int i=1;i<=4;i++)
{
dp[0][i]=0;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=4;j++)
{
if(S[i]!=hard[j])
{
dp[i][j]=dp[i-1][j];
}
else
{
dp[i][j]=min(dp[i-1][j-1],dp[i-1][j]+a[i]);
}
}
}
ans=dp[n][1];
for(int i=2;i<=4;i++)
{
if(dp[n][i]<ans)
{
ans=dp[n][i];
}
}
cout<<ans;
}