セクションDP「毎日の質問」

タスクの割り当て-トピック-Daimayuanオンラインジャッジ




 

アイデア:DP「体重が貪欲なら不可能ではない」

while(pos<=n&&arr[pos].e==i){
    dp[i] = max(dp[i],dp[arr[pos].s]+arr[pos].w);
    pos++;
}

ACコード:

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 1e3+10;
struct node{
	int s,e,w;
}arr[N];

bool cmp(struct node a,struct node b)
{
	return a.e<b.e;
}

int dp[N];
int main() {
	int n,maxe=0;cin>>n;
	dp[0]=0;
	for(int i=1;i<=n;i++){
		cin>>arr[i].s>>arr[i].e>>arr[i].w;
		maxe=max(maxe,arr[i].e);
	}
	sort(arr+1,arr+1+n,cmp);
	int pos=1;
	for(int i=1;i<=maxe;i++){
		dp[i]=dp[i-1];
		//现在到了终点,那么就从开始的那个点来积累
//		有可能有多个结束点相同,所以很合理
		while(arr[pos].e==i&&pos<=n){
			dp[i] = max(dp[i],dp[arr[pos].s]+arr[pos].w);
			pos++;
		}
		if(pos>n) break;
	}
	cout<<dp[maxe]<<endl;
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_60789461/article/details/123296874