题意:不知道什么类型的DP,做的时候没想出来,参考了篇博文
用num1表示到了构成前缀‘h'的最小代价,用num2表示构成前缀’ha‘的最小代价,用num3表示构成前缀'har'的最小代价,用num4表示构成前缀‘hard’的最小代价,那么状态转移方程就是
num1=num1+'h'
num2=min(num1,num2+'a')
num3=min(num2,num3+'r')
num4=min(num3,num4+'d')
最后输出num4即可,很简单的一个DP,还是非常有思维性的。
友情提示:爆int
附上代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5;
string s;
ll n,a[maxn],num[5];
int main()
{
cin>>n;
cin>>s;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;s[i];i++)
{
if(s[i]=='h') num[1]+=a[i];
if(s[i]=='a') num[2]=min(num[1],num[2]+a[i]);
if(s[i]=='r') num[3]=min(num[2],num[3]+a[i]);
if(s[i]=='d') num[4]=min(num[3],num[4]+a[i]);
}
cout<<num[4];
return 0;
}