Hdu 6495(dp)

Hdu 6495

思路:

题目意思很明确,重点是如果每次选取的这个冰水挑战,就会对后面整个序列进行影响。

所以可以每次先建立一个临时数组表示从上一个状态到下一个状态是选取这个元素,然后和不选取的元素进行比较,

以处理后的较大值为准(注意:每次选取一个元素对之后所有元素都有影响,所以一定要注意)。

然后最后求出最大的坐标,就是最多可以完成的挑战。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long LL;
const LL INF = 1e13+10;
const int maxn = 1200;
LL tp[maxn],dp[maxn];
LL MIN(LL x,LL y){
	return x<y?x:y;
}
LL MAX(LL x,LL y){
	return x>y?x:y;
}
int main(void)
{
	int T,i,j,n;
	LL m,ai,bi,ci;
	scanf("%d",&T);
	while(T--){
		scanf("%d%lld",&n,&m);
		fill(dp,dp+maxn,-INF);
		dp[0] = m;
		for(i=1;i<=n;i++){
			scanf("%lld%lld%lld",&ai,&bi,&ci);
			fill(tp,tp+maxn,-INF);
			for(j=1;j<=n;j++){
				LL x = MIN(dp[j-1],bi)-ai;
				if(x>0) tp[j] = x;
			}
			for(j=0;j<=n;j++){
				dp[j] = MAX(dp[j],tp[j])+ci;
				if(dp[j]<0) dp[j] = -INF;
			}
		}
		for(i=n;i>=0;i--){
			if(dp[i]>0){
				printf("%d\n",i);
				break;
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41829060/article/details/89338806