任务分配 - 题目 - Daimayuan Online Judge
思路: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;
}