题目链接:https://www.luogu.org/problem/CF1096D
题意:给你一个字符串,字符串每个位置处有一个代价wi,需要删去一些字符,使得字符串不存在子序列“hard”,求最小代价
分析:我们用dp[i]表示不存在hard的前i个字符所需要的最小代价
dp[4]的话前一个dp[4]加上该字符d减去的代价后和dp[3]作比较,取较小的
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e5+7; const int N=maxn*20; const ll inf=0x3f3f3f3f; #define mem0(a) memset(a,0,sizeof(a)) char a[maxn]; ll w; ll dp[5]; int main(){ int len; scanf("%d",&len); scanf("%s",a+1); //int len=strlen(a+1); for(int i=1;i<=len;i++){ scanf("%I64d",&w); if(a[i]=='h') dp[1]+=w; else if(a[i]=='a') dp[2]=min(dp[1],dp[2]+w); else if(a[i]=='r') dp[3]=min(dp[2],dp[3]+w); else if(a[i]=='d') dp[4]=min(dp[3],dp[4]+w); } printf("%I64d ",dp[4]); return 0; }