本题主要用到了对结构体的排序以及动态规划。
本体动态规划的状态转移方程为
if(j==p[i].r)
f[j]=max(f[j],f[p[i].l]+p[i].w);//如果j是某一活动结束时间,那么f[j]等于选择或不选择这个任务中的利益的最大值
else
f[j]=max(f[j],f[j-1]);//如果j在活动时间之后,那么发f[j]就等于这一秒或前一秒中的最大值
下面直接上代码解释了
#include <iostream>
#include <algorithm>
using namespace std;
struct pp
{
int l;
int r;
int w;
}p[1005];
int f[1005];
int n;
bool cmp(pp x,pp y)//结构体排序函数
{
if(x.l==y.l)
return x.r<y.r;
return x.l<y.l;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)//初始化
{
cin>>p[i].l>>p[i].r>>p[i].w;
if(p[i].r==p[i].l)
p[i].r++;
}
sort(p,p+n+1,cmp);
int a=p[1].r;
for(int i=1;i<=n;i++)//a是最后时间
{
if(a<p[i].r)
a=p[i].r;
}
for(int i=1;i<=n;i++)//动态规划
{
for(int j=p[i].r;j<=a;j++)
{
if(j==p[i].r)
f[j]=max(f[j],f[p[i].l]+p[i].w);
else
f[j]=max(f[j],f[j-1]);
}
}
sort(f,f+a+1);
cout<<f[a];
return 0;
}