题解 CF1096D 【Easy Problem】

题目link:
Codeforces
luogu
unaccept的同学们

要开long long!

事实上此题就是dp,dp[i][j]表示前i个字符中清到‘hard’的第几个
状态转移方程:


if(S[i]!=hard[j])
{
	dp[i][j]=dp[i-1][j];
}
else
{
	dp[i][j]=min(dp[i-1][j-1],dp[i-1][j]+a[i]);
}

关于else里的转移方程:因为要破掉‘hard’,可以扔前面的,也可以灭当前这个
第一个方程就不用讲了吧
然后就可以到代码中理解了


#include<bits/stdc++.h>
using namespace std;
long long n,a[100010],dp[100010][10],ans;
char hard[5]={'\0','h','a','r','d'},S[100010];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>S[i];
	}
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	memset(dp,0x7f,sizeof(dp));
	for(int i=1;i<=4;i++)
	{
		dp[0][i]=0;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=4;j++)
		{
			if(S[i]!=hard[j])
			{
				dp[i][j]=dp[i-1][j];
			}
			else
			{
				dp[i][j]=min(dp[i-1][j-1],dp[i-1][j]+a[i]);
			}
		}
	}
	ans=dp[n][1];
	for(int i=2;i<=4;i++)
	{
		if(dp[n][i]<ans)
		{
			ans=dp[n][i];
		}
	}
	cout<<ans;
}
posted @ 2019-02-12 14:32  G_A_TS  阅读(462)  评论(0编辑  收藏  举报