注释明天写。先附上代码。
#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; }