Vasya is preparing a contest, and now he has written a statement for an easy problem. The statement is a string of length n

consisting of lowercase Latin latters. Vasya thinks that the statement can be considered hard if it contains a subsequence hard; otherwise the statement is easy. For example, hard, hzazrzd, haaaaard can be considered hard statements, while har, hart and drah are easy statements.

Vasya doesn't want the statement to be hard. He may remove some characters from the statement in order to make it easy. But, of course, some parts of the statement can be crucial to understanding. Initially the ambiguity of the statement is 0

, and removing i-th character increases the ambiguity by ai (the index of each character is considered as it was in the original statement, so, for example, if you delete character r from hard, and then character d, the index of d is still 4

even though you delete it from the string had).

Vasya wants to calculate the minimum ambiguity of the statement, if he removes some characters (possibly zero) so that the statement is easy. Help him to do it!

Recall that subsequence is a sequence that can be derived from another sequence by deleting some elements without changing the order of the remaining elements.

Input

The first line contains one integer n

(1≤n≤105

) — the length of the statement.

The second line contains one string s

of length n

, consisting of lowercase Latin letters — the statement written by Vasya.

The third line contains n

integers a1,a2,…,an (1≤ai≤998244353

).

Output

Print minimum possible ambiguity of the statement after Vasya deletes some (possibly zero) characters so the resulting statement is easy.

Examples
Input

Copy
6
hhardh
3 2 9 11 7 1
Output

Copy
5
Input

Copy
8
hhzarwde
3 2 6 9 4 8 7 1
Output

Copy
4
Input

Copy
6
hhaarr
1 2 3 4 5 6
Output

Copy
0
Note

In the first example, first two characters are removed so the result is ardh.

In the second example, 5

-th character is removed so the result is hhzawde.

In the third example there's no need to remove anything.

题意:给定一个字符串,每个字符自带权值,让你删去一些,使得不存在子序列“hard”,问最下的权值是多少。

思路:因为有顺序问题,所以我们记录维护到当前最长的前缀的代价。1对应h,2对应ha,3对应har,4对应hard,然后就不难写出方程了。

(复杂度O(5N),比赛时写了个2进制,复杂度O(16N);傻了

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
#define ll long long
const int maxn=;
int a[maxn];ll dp[maxn][],ans; char c[maxn]; int Laxt[maxn];
int id(char s){
if(s=='h') return ;
if(s=='a') return ;
if(s=='r') return ;
if(s=='d') return ;
return -;
}
void ADD(ll &x,ll y){
if(y==-) return ;
if(x==-) x=y;
else x=min(x,y);
}
int main()
{
int N;
scanf("%d%s",&N,c+); memset(dp,-,sizeof(dp));
rep(i,,N) scanf("%d",&a[i]);
dp[][]=;
rep(i,,N){
int p=id(c[i]);
if(p==-) {
rep(j,,) dp[i][j]=dp[i-][j];
continue;
}
if(dp[i-1][p-1]!=-1) ADD(dp[i][p-],dp[i-][p-]+a[i]);
ADD(dp[i][p],dp[i-][p-]);
rep(j,,){
if(j==p-) continue;
ADD(dp[i][j],dp[i-][j]);
}
}
ans=1LL<<; rep(i,,) if(dp[N][i]!=-) ans=min(ans,dp[N][i]);
printf("%lld\n",ans);
return ;
}

CF1096:D. Easy Problem(DP)的更多相关文章

  1. D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) )

    D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) ) 题意 给出一个串 给出删除每一个字符的代价问使得串里面没有hard的子序列需要付出的最小代价(子序列不连续也行) 思路 要 ...

  2. Codeforces 1096D - Easy Problem - [DP]

    题目链接:http://codeforces.com/problemset/problem/1096/D 题意: 给出一个小写字母组成的字符串,如果该字符串的某个子序列为 $hard$,就代表这个字符 ...

  3. CF1096D Easy Problem(DP)

    题意:给出一个字符串,去掉第i位的花费为a[i],求使字符串中子串不含hard的最小代价. 题解:这题的思路还是比较套路的,    dp[i][kd]两维,kd=0表示不含d的最小花费,1表示不含rd ...

  4. CF1096D Easy Problem

    题目地址:CF1096D Easy Problem 比赛时高二dalaoLRZ提醒我是状压,然而,我还是没AC (汗 其实是一道很基础的线性dp \(f_{i,j}\) 表示序列第 \(i\) 个字符 ...

  5. HDU 4359——Easy Tree DP?——————【dp+组合计数】

    Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  6. 线段树:CDOJ1591-An easy problem A (RMQ算法和最简单的线段树模板)

    An easy problem A Time Limit: 1000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...

  7. HDU 4359 Easy Tree DP?

    Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  8. UVA-11991 Easy Problem from Rujia Liu?

    Problem E Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for ...

  9. An easy problem

    An easy problem Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Sub ...

随机推荐

  1. Qt_DLL_4_MFC

    1.下载地址: https://github.com/qtproject/qt-solutions 2. ZC: 做用于MFC的DLL的时候,app的创建 只能是在 主线程中,不然的话 就会报错... ...

  2. python - 面向对象编程(初级篇)

    写了这么多python 代码,也常用的类和对象,这里准备系统的对python的面向对象编程做以下介绍. 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计) ...

  3. Apache配置文件httpd.conf细说

    1.httpd.conf文件位于apache安装目录/conf下2.Listen 88表示监听端口88 此处可以连续写多个端口监听如下: Listen 88 Listen 809 3.目录配置如下: ...

  4. C#读写记事本(txt)文件

    C#写入记事本(txt)文件方法一: FileStream stream = new FileStream(@"d:\aa.txt",FileMode.Create);//file ...

  5. 雷林鹏分享:Ruby 变量

    Ruby 变量 变量是持有可被任何程序使用的任何数据的存储位置. Ruby 支持五种类型的变量.您已经在前面的章节中大概了解了这些变量,本章节将为您详细讲解这五种类型的变量. Ruby 全局变量 全局 ...

  6. ansible-playbook快速入门填坑

    参考另外一篇文章 http://blog.51cto.com/weiweidefeng/1895261 when条件 参考http://blog.51cto.com/breezey/1757593 安 ...

  7. ccf第二题总结

    1.游戏 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加, ...

  8. bfs,dfs区别

    一般来说用DFS解决的问题都可以用BFS来解决. DFS(深搜的同时考虑回溯) bfs=队列,入队列,出队列:dfs=栈,压栈,出栈 bfs是按一层一层来访问的,所以适合有目标求最短路的步数,你想想层 ...

  9. HDU1789时间贪心

    Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  10. splunk LB和scale(根本在于分布式扩展index,search)

    Forwarder deployment topologies You can deploy forwarders in a wide variety of scenarios. This topic ...