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 }

浙公网安备 33010602011771号