CF1096:D. Easy Problem(DP)
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.
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
).
Print minimum possible ambiguity of the statement after Vasya deletes some (possibly zero) characters so the resulting statement is easy.
6
hhardh
3 2 9 11 7 1
5
8
hhzarwde
3 2 6 9 4 8 7 1
4
6
hhaarr
1 2 3 4 5 6
0
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)的更多相关文章
- D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) )
D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) ) 题意 给出一个串 给出删除每一个字符的代价问使得串里面没有hard的子序列需要付出的最小代价(子序列不连续也行) 思路 要 ...
- Codeforces 1096D - Easy Problem - [DP]
题目链接:http://codeforces.com/problemset/problem/1096/D 题意: 给出一个小写字母组成的字符串,如果该字符串的某个子序列为 $hard$,就代表这个字符 ...
- CF1096D Easy Problem(DP)
题意:给出一个字符串,去掉第i位的花费为a[i],求使字符串中子串不含hard的最小代价. 题解:这题的思路还是比较套路的, dp[i][kd]两维,kd=0表示不含d的最小花费,1表示不含rd ...
- CF1096D Easy Problem
题目地址:CF1096D Easy Problem 比赛时高二dalaoLRZ提醒我是状压,然而,我还是没AC (汗 其实是一道很基础的线性dp \(f_{i,j}\) 表示序列第 \(i\) 个字符 ...
- HDU 4359——Easy Tree DP?——————【dp+组合计数】
Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- 线段树:CDOJ1591-An easy problem A (RMQ算法和最简单的线段树模板)
An easy problem A Time Limit: 1000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...
- HDU 4359 Easy Tree DP?
Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- UVA-11991 Easy Problem from Rujia Liu?
Problem E Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for ...
- An easy problem
An easy problem Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Sub ...
随机推荐
- 关于QT的QPainterPath::arcTo 详解
这个函数文档的意思就是画弧,看了文档也不太明白,自己做了demo终于明白了意思 移动到圆心,画180度半圆 void TestArcTo::paintEvent(QPaintEvent *) { QP ...
- es6模块 nodejs模块和 typescript模块
es6模块 import和export nodejs模块 require和module.exports typescript模块 module和export
- Java EE、Java SE和Java ME
Java SE=Java Standard EditionJava EE=Java Enterprise EditionJava ME=Java Mobile Edition SE主要用于桌面程序,控 ...
- rsync+inotify文件同步 - 同步慢的问题
rsync+inotify文件同步 - 同步慢的问题 我们来看网上的教程,我加了注释.(网上所有的教程基本都一模一样,尽管写法不一样,致命点都是一样的) #!/bin/bash /usr/bin/in ...
- 转发一篇分析LinQ是什么?
LINQ(发音:Link)是语言级集成查询(Language INtegrated Query) ?LINQ是一种用来进行数据访问的编程模型,使得.NET语言可以直接支持数据查询 ?LINQ的目标是降 ...
- Matlab scatter 如何显示不同颜色点状
有时候需要在matlab scatter绘图中显示不同颜色区分,如下图是人体血压高压.低压与年龄关系的散点图. 红色点表示高压 绿色点表示低压 用 matlab 如何实现呢? 1.创建一维矩阵x,y1 ...
- python-day8-元组的内置方法
#为何要有元组,存放多个值,元组不可变,更多的是用来做查询# t=(1,[1,3],'sss',(1,2)) #t=tuple((1,[1,3],'sss',(1,2)))# print(type(t ...
- vijos1746 floyd
小D的旅行 旅行是一件颇有趣的事情,但是在旅行前规划好路线也很重要. 现在小D计划要去U国旅行. U国有N个城市,M条道路,每条道路都连接着两个城市,并且经过这条道路需要一定的费用wi. 现在小D想要 ...
- 连接ACCESS
access2000-2003数据库连接字符串: ConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=数据库名.mdb"; ...
- python 小练习12
给你一个整数数列a1,a2,a3,...,an,请你修改(不能删除,只能修改)最少的数字,使得数列严格单调递增. 数列存储在列表L中,你可以直接使用L,L的长度小于100000. 注意:必须保证修改后 ...