注释明天写。先附上代码。
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int start;
int end;
int val;
};
node fuck[1005];
int dp[1005][105];
bool cmp(node a,node b)
{
return b.start>a.start;
}
int main()
{
int t,m,n;
cin>>t;
while(t!=0)
{
cin>>m>>n;
for(int i=1;i<=n;i++)
cin>>fuck[i].start>>fuck[i].end>>fuck[i].val;
sort(fuck+1,fuck+1+n,cmp);
memset(dp,0,sizeof(dp));
for(int j=0;j<=m;j++)
if(j<fuck[1].end)
dp[1][j]=0;
else dp[1][j]=fuck[1].val;
for(int j=2;j<=n;j++)
for(int k=1;k<=m;k++)
{
if(k<fuck[j].end)
dp[j][k]=dp[j-1][k];
else if(dp[j-1][fuck[j].start-1]+fuck[j].val>dp[j-1][k])
dp[j][k]=dp[j-1][fuck[j].start-1]+fuck[j].val;
else dp[j][k]=dp[j-1][k];
}
cout<<dp[n][m]<<endl;
t=t-1;
}
return 0;
}
有更简单的了,模仿01背包写
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int start;
int end;
int profit;
};
node fuck[2000];
int dp[2000];
bool cmp(node a,node b)
{
return a.start<b.start;//按照开始时间从小到大进行排序
}
int maxi(int a,int b)
{
if(a>b)
return a;
else return b;
}
int main()
{
int T,m,n,i,j;
cin>>T;
while(T!=0)
{
cin>>m>>n;//工作的时间段从0到m,一共有n个工作可供选择。
for(i=1;i<=n;i++)
cin>>fuck[i].start>>fuck[i].end>>fuck[i].profit;//输入工作的信息,起始时间,结束时间和工作的报酬
sort(fuck+1,fuck+1+n,cmp);//排序
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
for(j=m;j>=fuck[i].end;j--)//这个地方和01背包是相同的
dp[j]=maxi(dp[j],dp[fuck[i].start-1]+fuck[i].profit);//dp[i]表示到第i天最多能拿多少报酬,关键是后面的变量,因为不允许时间
cout<<dp[m]<<endl; //有重叠
T=T-1;
}
return 0;
}