CF1096D Easy Problem

 

 

 

 题目链接:https://vjudge.net/problem/CodeForces-1096D

题意:给出一个长度为n的字符串,字符串中的每一个字符都有一个对应的权值。要求删去若干字符,使得新的字符串中不包含子序列“hard”,且删去的字符权值最小。

思路:

字符串DP

我们用dp[i][j] 表示字符串的前i个字符,清理到“hard”的第j位时,所花费的最小代价。

1.如果s[i]!=hard[j],不需要删掉这一位:dp[i][j]=dp[i-1][j];

2.如果s[i]=hard[j]:

(1)删掉:dp[i-1][j]+a[i];

(2)不删:dp[i-1][j-1];

AC代码:

 1 #include <iostream>
 2 #include <cstring> 
 3 using namespace std;
 4 typedef long long ll;
 5 const int N=1e5+10;
 6 char hard[]="hard";
 7 char s[N];
 8 int  a[N];
 9 ll dp[N][5];
10 
11 int main()
12 {
13     int n;scanf("%d",&n);
14     scanf("%s",s+1);
15     for (int i=1;i<=n;i++) scanf("%d",&a[i]);
16     memset(dp,0x3f,sizeof(dp));
17     for (int i=1;i<=4;i++) dp[0][i]=0;
18     for (int i=1;i<=n;i++){
19         for (int j=1;j<=4;j++){
20             if (s[i]!=hard[j-1]){
21                 dp[i][j]=dp[i-1][j];
22             }
23             else{
24                 dp[i][j]=min(dp[i-1][j-1],dp[i-1][j]+1ll*a[i]);
25             }
26         }
27     }
28     printf("%lld",dp[n][4]);
29     return 0;
30 }

 

posted @ 2020-03-31 15:32  Chillilly  阅读(105)  评论(0)    收藏  举报