Codeforces 1096D - Easy Problem - [DP]
题目链接:http://codeforces.com/problemset/problem/1096/D
题意:
给出一个小写字母组成的字符串,如果该字符串的某个子序列为 $hard$,就代表这个字符串是不好的。
现在你要删掉若干字母,使得字符串是好的,同时删除第 $i$ 个字母会使得歧义程度增加 $a[i]$,你需要让歧义程度最低,输出这个值。
题解:
$dp[i][x=0,1,2,3]$ 的状态是前 $i$ 个字母,第二维 $x$ 代表:$0$——不包含任何有可能构成 “$hard$” 的子序列;$1$——含有 “$h$” 子序列;$2$——含有 “$ha$” 子序列;$3$——含有 $har$ 子序列。
$dp[i][x=0,1,2,3]$ 记录的值当然就是歧义程度。
转移的话,$dp[i][0]$ 的转移很简单。其次,则需要分别考虑当前字符是不是 $h$、$a$、$r$,然后相应转移出 $dp[i][1]$、$dp[i][2]$、$dp[i][3]$,具体参加代码。
另外一个需要注意的是 ok?x:y 这个三目运算符外面要加括号……要不然由于加号优先级比它高,所以会把前面的加号也算在判定条件里……
讲真,刚开始想道这样设定状态,以及相应的状态转移到底对不对,心里也没底,没想到写了一发居然就1A了……
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=1e5+;
int n;
char s[maxn];
ll a[maxn];
ll dp[maxn][];
void print(int i) {
cout<<dp[i][]<<" "<<dp[i][]<<" "<<dp[i][]<<" "<<dp[i][]<<endl;
}
int main()
{
cin>>n;
scanf("%s",s+);
for(int i=;i<=n;i++) scanf("%I64d",&a[i]); memset(dp,0x3f,sizeof(dp));
if(s[]=='h')
dp[][]=a[], dp[][]=;
else
dp[][]=;
for(int i=;i<=n;i++)
{
dp[i][]=dp[i-][]+((s[i]=='h')?a[i]:0ll); if(s[i]=='h')
dp[i][]=min(dp[i-][],dp[i-][]);
else
dp[i][]=dp[i-][]+((s[i]=='a')?a[i]:0ll); if(s[i]=='a')
dp[i][]=min(dp[i-][],dp[i-][]);
else
dp[i][]=dp[i-][]+((s[i]=='r')?a[i]:0ll); if(s[i]=='r')
dp[i][]=min(dp[i-][],dp[i-][]);
else
dp[i][]=dp[i-][]+((s[i]=='d')?a[i]:0ll);
} ll ans=INF;
for(int i=;i<;i++) ans=min(ans,dp[n][i]);
cout<<ans<<endl;
}
Codeforces 1096D - Easy Problem - [DP]的更多相关文章
- Codeforces 1096D Easy Problem 【DP】
<题目链接> 题目大意: 给你一个字符串,每个字符有权值,问现在删除字符串中的字符使其中没有"hard"的最小代价是多少. 解题分析: 用DP来求解: 转 ...
- D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) )
D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) ) 题意 给出一个串 给出删除每一个字符的代价问使得串里面没有hard的子序列需要付出的最小代价(子序列不连续也行) 思路 要 ...
- CF1096:D. Easy Problem(DP)
Vasya is preparing a contest, and now he has written a statement for an easy problem. The statement ...
- CF 1096D Easy Problem [动态规划]
题目链接:http://codeforces.com/problemset/problem/1096/D 题意: 有一长度为n的字符串,每一字符都有一个权值,要求现在从中取出若干个字符,使得字符串中没 ...
- Codeforces 706C - Hard problem - [DP]
题目链接:https://codeforces.com/problemset/problem/706/C 题意: 给出 $n$ 个字符串,对于第 $i$ 个字符串,你可以选择花费 $c_i$ 来将它整 ...
- CF1096D Easy Problem(DP)
题意:给出一个字符串,去掉第i位的花费为a[i],求使字符串中子串不含hard的最小代价. 题解:这题的思路还是比较套路的, dp[i][kd]两维,kd=0表示不含d的最小花费,1表示不含rd ...
- CodeForces 1096D(线性dp)
传送门 •题意 给出一个长度为n的字符串s,对于每个$s_{i}$有$a_{i}$的价值 让你删除最小的价值,使得字符串中不存在$hard$这个子序列 •思路 设dp[1]是不存在以$h$为前缀的最小 ...
- Codeforces 706 C. Hard problem (dp)
题目链接:http://codeforces.com/problemset/problem/706/C 给你n个字符串,可以反转任意一个字符串,反转每个字符串都有其对应的花费ci. 经过操作后是否能满 ...
- codeforces A. In Search of an Easy Problem
A. In Search of an Easy Problem time limit per test 1 second memory limit per test 256 megabytes inp ...
随机推荐
- StringUtils类中isEmpty与isBlank的区别
org.apache.commons.lang.StringUtils类提供了String的常用操作,最为常用的判空有如下两种isEmpty(String str)和isBlank(String st ...
- 高性能IO之Reactor模式(转载)
讲到高性能IO绕不开Reactor模式,它是大多数IO相关组件如Netty.Redis在使用的IO模式,为什么需要这种模式,它是如何设计来解决高性能并发的呢? 最最原始的网络编程思路就是服务器用一个w ...
- 关于tcp中time_wait状态的4个问题
time_wait是个常问的问题.tcp网络编程中最不easy理解的也是它的time_wait状态,这也说明了tcp/ip四次挥手中time_wait状态的重要性. 以下通过4个问题来描写叙述它 问题 ...
- [Android实例教程] 教你如何拍照+相册选择图片+剪裁图片完整实现
[Android实例教程] 教你如何拍照+相册选择图片+剪裁图片完整实现 今天做Android项目的时候要用到图片选择,要实现拍照获取图片和从相册获取图片,并且要求在获取完之后可以裁剪,试了很多方法之 ...
- 3D建模软件的选择(UG,Solidworks,ProE)
转自:3D建模软件的选择(UG,Solidworks,ProE) 自述 咱是一个码农,和web.软件.控制台打交道太多了,很想玩玩炫的东西,于是学了点点PS,结果发现完全没有美术细胞TT.最近有碰到对 ...
- function 与 => 的区别
在JS中,箭头函数并不是简单的function(){}匿名函数的简写语法糖,实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,在编写函数时就已经确定了.而匿名函数的this ...
- linux每日命令(18):whereis命令
whereis命令用于查找文件. 该指令会在特定目录中查找符合条件的文件.这些文件应属于原始代码.二进制文件,或是帮助文件. 该指令只能用于查找二进制文件.源代码文件和man手册页,一般文件的定位需使 ...
- golang:mime.Decode、mime.DecodeHeader
最近在做邮件解析的相关工作,在使用mime.Decode/mime.DecodeHeader时有些疑问. 有些搞不懂mime.Encode和mime.EncodeHeader的区别.
- shell生成连续天数日期
#!/bin/bash #两个参数:起始时间和终止时间,循环输出每天 #输入格式:20171201 20171225 #输出格式:2017-12-01 2017-12-25 startdate=`da ...
- hdoj:2044
#include <iostream> using namespace std; long long fib(int n) { ; ; ) ; ) { long long f2 = f0 ...