CF1096D Easy Problem

题目:Easy Problem

思路:
令f[i]表示把字符i全部去掉的最小代价。
转移: f [ i ] = m i n ( f [ i − 1 ] , f [ i ] + w [ j ] ) f[i]=min(f[i-1],f[i]+w[j]) f[i]=min(f[i1],f[i]+w[j])

代码:

#include
using namespace std;

#define maxn 100000
#define read(x) scanf("%d",&x)
#define ll long long

int n;
char s[maxn+5];
int w[maxn+5];

ll f[15];

int main() {
	read(n);scanf("%s",s+1);
	for(int i=1;i<=n;i++) read(w[i]);
	
	for(int i=1;i<=n;i++) {
		if(s[i]=='h') f[1]+=w[i];
		else if(s[i]=='a') f[2]=min(f[1],f[2]+w[i]);
		else if(s[i]=='r') f[3]=min(f[2],f[3]+w[i]);
		else if(s[i]=='d') f[4]=min(f[3],f[4]+w[i]);
	}
	
	printf("%lld",f[4]);
	
	return 0;
}

你可能感兴趣的:(动态规划)