CF1090D Easy Problem

题目链接: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\n",dp[4]);
    return 0;
}

 

posted @ 2019-09-10 11:17  清酒令  阅读(208)  评论(0编辑  收藏  举报