题目来源:http://codeforces.com/problemset/problem/1096/D
题意:使得字符串中删除一些序列使之不存在hard序列。
贪心情况太多,貌似也可以确定hard的每个字母的最后的下标去贪,不过dp思想还是非常好的。
dp[i][j]表示长度为i的字符串不含hh[0]-hh[j]的最小要删的价值。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<cmath>
#include<bits/stdc++.h>
#include<string>
#include<map>
using namespace std;
typedef long long ll;
char hh[]="hard";
ll a[100100];
char s[100100];
ll dp[100100][10];
int main()
{
memset(dp,0,sizeof(dp));
int n,i,j;
scanf("%d",&n);
cin>>s;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
if(s[i]=='h')
{
dp[i][0]=dp[i-1][0]+a[i];
}
else
dp[i][0]=dp[i-1][0];
}
for(j=1;j<4;j++)
{
for(i=0;i<n;i++)
{
if(s[i]==hh[j])
{
dp[i][j]=min(dp[i-1][j-1],dp[i-1][j]+a[i]);
}
else
dp[i][j]=dp[i-1][j];
}
}
printf("%I64d",dp[n-1][3]);
return 0;
}