题意:给你一个字符串,让你删除某些字符使得这个串的所有子串不包括hard,删除每个字符有花费,求一个最小花费。
思路:dp[i][j]表示到第i个字符可以组成hard的前j个字母,然后对每一个字符,递推转移一下。
#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;
ll dp[100001][5],n;
int main()
{
string s;
cin>>n>>s;
dp[0][1]=1e18;
dp[0][2]=1e18;
dp[0][3]=1e18;
for(int i = 0; i<n; i++)
{
ll a;
scanf("%lld",&a);
if(s[i] == 'h')
{
dp[i+1][0] = dp[i][0] + a;
dp[i+1][1] = min(dp[i][1],dp[i][0]);
dp[i+1][2] = dp[i][2];
dp[i+1][3] = dp[i][3];
}
else if(s[i]=='a')
{
dp[i+1][0] = dp[i][0];
dp[i+1][1] = dp[i][1] + a;
dp[i+1][2] = min(dp[i][2],dp[i][1]);
dp[i+1][3] = dp[i][3];
}
else if(s[i]=='r')
{
dp[i+1][0] = dp[i][0];
dp[i+1][1] = dp[i][1];
dp[i+1][2] = dp[i][2] + a;
dp[i+1][3] = min(dp[i][3],dp[i][2]);
}
else if(s[i]=='d')
{
dp[i+1][0] = dp[i][0];
dp[i+1][1] = dp[i][1];
dp[i+1][2] = dp[i][2];
dp[i+1][3] = dp[i][3] + a;
}
else
{
dp[i+1][0] = dp[i][0];
dp[i+1][1] = dp[i][1];
dp[i+1][2] = dp[i][2];
dp[i+1][3] = dp[i][3];
}
}
cout<<min(min(dp[n][0],dp[n][1]),min(dp[n][2],dp[n][3]))<<endl;
}