Educational Codeforces Round 57 (Rated for Div. 2) 1096D(dp思维)

题目来源:http://codeforces.com/problemset/problem/1096/D

题意:使得字符串中删除一些序列使之不存在hard序列。

贪心情况太多,貌似也可以确定hard的每个字母的最后的下标去贪,不过dp思想还是非常好的。

dp[i][j]表示长度为i的字符串不含hh[0]-hh[j]的最小要删的价值。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<cmath>
#include<bits/stdc++.h>
#include<string>
#include<map>
using namespace std;
typedef long long ll;
char hh[]="hard";
ll a[100100];
char s[100100];
ll dp[100100][10];
int main()
{
	memset(dp,0,sizeof(dp));
	int n,i,j;
	scanf("%d",&n);
	cin>>s;
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(i=0;i<n;i++)
	{
		if(s[i]=='h')
		{
			dp[i][0]=dp[i-1][0]+a[i];
		}
		else
		dp[i][0]=dp[i-1][0];
	}
	for(j=1;j<4;j++)
	{
		for(i=0;i<n;i++)
		{
			if(s[i]==hh[j])
			{
				dp[i][j]=min(dp[i-1][j-1],dp[i-1][j]+a[i]);
			}
			else
			dp[i][j]=dp[i-1][j];
		}
	}
	printf("%I64d",dp[n-1][3]);
	return 0;
}
发布了56 篇原创文章 · 获赞 17 · 访问量 2333

猜你喜欢

转载自blog.csdn.net/weixin_43958964/article/details/100642093
今日推荐