题目:http://codeforces.com/problemset/problem/1096/D
题意:给出一个字符串,每个字符对应一个权值,如果其中有子序列“hard”,就称是困难的字符串,求将其改成非困难的字符串最少需要删除字符的权值。
#include <cassert>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <iterator>
#include <ctime>
#include <algorithm>
#include <bitset>
#include <deque>
#include <iostream>
#include <iomanip>
#include <limits>
#include<functional>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <utility>
#include <vector>
#include <numeric>
#define inf 1<<30
#define mod 1000000007
#define seed 131
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define lowbit(x) ((x)&(-x))
#define lrtnb srand(unsigned(time(NULL)))
#define lrtlh ios::sync_with_stdio(0)
#define lowb(a,n,x) lower_bound(a,a+n,x) - a
#define uppb(a,n,x) upper_bound(a,a+n,x) - a
#define lson l,mid,i<<1;
#define rson mid+1,r,i<<1|1;
#define ALL(x) x.begin(),x.end()
#define inv inline void
#define INS(x) inserter(x,x.begin())
using namespace std;
typedef long long ll;
typedef long double ld;
typedef priority_queue<int> pqi;
typedef priority_queue<ll> pql;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef map<int, int> mii;
typedef map<ll, ll> mll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef queue<int> qi;
typedef queue<ll> ql;
typedef stack<int> si;
typedef stack<ll> sl;
typedef set<int> Si;
typedef set<ll> Sl;
ll gcd(ll n, ll m) { long long t, r; if (n < m)swap(n, m); while (m) { r = n % m; n = m; m = r; }return n; }
ll lcm(ll b, ll y) { return b * y / gcd(b, y); }
//double dis(double x1, double x2, double y1, double y2) { double ans = (x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2); return sqrt(ans); }
double random(double start, double en) { return start + (en - start)*rand() / (RAND_MAX + 1.0); }
void read(int &n) { char c = '+'; int x = 0; bool flag = 0; while (c<'0' || c>'9') { c = getchar(); if (c == '-')flag = 1; }while (c >= '0'&&c <= '9')x = x * 10 + c - 48, c = getchar(); n = flag == 1 ? -x : x; }
ll dp[100010][5];
int main()
{
ll n;
string s;
while (cin >> n >> s) {
mem(dp, 0);
ll q;
for (int i = 0; i < n; i++) {
cin >> q;
if (s[i] == 'h') {
dp[i + 1][0] = q + dp[i][0];
dp[i + 1][1] = dp[i][1];
dp[i + 1][2] = dp[i][2];
dp[i + 1][3] = dp[i][3];
}
else if (s[i] == 'a') {
dp[i + 1][1] = min(q + dp[i][1], dp[i][0]);
dp[i + 1][0] = dp[i][0];
dp[i + 1][2] = dp[i][2];
dp[i + 1][3] = dp[i][3];
}
else if (s[i] == 'r') {
dp[i + 1][2] = min(q + dp[i][2], dp[i][1]);
dp[i + 1][0] = dp[i][0];
dp[i + 1][1] = dp[i][1];
dp[i + 1][3] = dp[i][3];
}
else if (s[i] == 'd') {
dp[i + 1][3] = min(q + dp[i][3], dp[i][2]);
dp[i + 1][0] = dp[i][0];
dp[i + 1][1] = dp[i][1];
dp[i + 1][2] = dp[i][2];
}
else {
dp[i + 1][0] = dp[i][0];
dp[i + 1][1] = dp[i][1];
dp[i + 1][2] = dp[i][2];
dp[i + 1][3] = dp[i][3];
}
}
cout << dp[n][3] << endl;
}
//system("pause");
}