#include<iostream>
#include<algorithm>
using namespace std;
#define Max(a,b)(a>b?a:b)
int m,n;
struct Job
{
int s,e,val;
};
Job TT[1005];
int dp[105];
bool cmp(Job a,Job b)
{
return a.e<b.e;
}
void run()
{
int i,j;
scanf("%d%d",&m,&n);
fill(dp,dp+105,0);
for(i=0;i<n;i++)
{
scanf("%d%d%d",&TT[i].s,&TT[i].e,&TT[i].val);
}
sort(TT,TT+n,cmp);
for(i=1;i<=m;i++)
{
for(j=0;j<n;j++)
{
if(TT[j].e>i) break;
dp[i]=Max(dp[i],dp[TT[j].s-1]+TT[j].val);
}
}
printf("%d\n",dp[m]);
}
int main()
{
int T;
cin>>T;
while(T--) run();
return 0;
}
简单的一维DP:dp[i[表示到第i天为止 所能够赚最多的钱!
转移方程 dp[i]=Max(dp[i],dp[i-TT[j].s-1]+TT[j].val)
预处理:将n个工作排序 按结束时间早优先。
循环DP时 if(TT[j].e>i) break;