https://www.luogu.org/problemnew/show/P1280
题意:给了k个时间段不能重叠,求能得到的最大的空余时间。
状态转移方程:
这个时间段没工作 dp[i]=dp[i+1]+1
有工作 dp[i]=max(dp[i],dp[i+p[w].y])
#include<bits/stdc++.h>
using namespace std;
int a[10006],dp[10006],b[10006];
struct nomd
{
int x,y;
}p[10006];
int cmp(nomd a,nomd b)
{
return a.x>b.x;
}
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=k;i++)
{
cin>>p[i].x>>p[i].y;
a[p[i].x]++;
}
sort(p+1,p+1+k,cmp);int w=1;
for(int i=n;i>0;i--)
{
if(a[i]==0)
{
dp[i]=dp[i+1]+1;
}
else
{
for(int j=0;j<a[i];j++)
{
dp[i]=max(dp[i],dp[i+p[w].y]);
w++;
}
}
}
printf("%d\n",dp[1]);
return 0;
}