2020年字符串专题训练赛04

字符串dp部分:
具体字符串dp部分请看我另一篇博客。
H题:easy problem//一般这样的都不是很easy
看了一下题目。。。确实很easy//呸!
给你一串有权值的字符串,你可以删除某些字符串使它不含子序列hard,求使所删除的字符权值最小的情况。
这个题目 我刚一拿到以为是。。hash然后写不出来自闭了,看了题解后发现是字符串dp 。
具体实现方法:1.找出具体的转移方程
借了大神的一段话

dp[i][x=0,1,2,3] 的状态是前 i 个字母,第二维 x 代表:0——不包含任何有可能构成 “hard” 的子序列;1——含有
“h” 子序列;2——含有 “ha” 子序列;3——含有 har 子序列。

然后问题就很好解决了,分别记录出这些字符串中所有的dp【】【1】, dp【】【2】, dp【】【3】, dp【】【4】
上一段代码吧!

for(int i = 1; i <= n; i++){ // 直接处理掉'h'的情况
		if(s[i] == 'h'){
			dp[i][1] = dp[i - 1][1] + a[i];
		} else{
			dp[i][1] = dp[i - 1][1];
		}
	}
 
	for(int j = 2; j <= 4; j++){
		for(int i = 2; i <= n; i++){
			if(s[i] == ch[j]){ // 若相等,以'har'举例,若想要1到i不含har,则需要1到i - 1不含'hr'或使前面不含har,并删除r.
				dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j] + a[i]);
			} else{
				dp[i][j] = dp[i - 1][j];
			}
		}

dp的转移方法很好理解。。
这个题也可以算是dp的入门题吧 就是题目比较难懂 但是看样例还是比较好理解的!

你可能感兴趣的:(acm)