洛谷P1280 尼克的任务 动态规划

把区间上的问题转化为点上的问题,即把时间段上的问题转化为时间点上的问题

f[i]表示i到n时刻的最大空闲时间

状态方程f[i]

=f[i+1]+1(第i个时刻没有任务时)

=max(f[i],f[i+a[j].l])(有任务时,a[j].l表示i时刻这一任务持续的时间)

#include<iostream>
#include<algorithm>
using namespace std;
struct pp
{
    int s;//start时刻 
    int l;//last时间 
}a[10005];
int n,k,dp[10005];
int book[10005];//标记这个时刻是否有任务 
bool cmp(pp a,pp b)
{
    return a.s>b.s;
}
void solve()
{
    int i,j;
    cin>>n>>k;
    for(i=1;i<=k;i++)
    {
        cin>>a[i].s>>a[i].l;
        a[i].s--;
        book[a[i].s]++;//这一时刻有几个任务 
    }
    sort(a+1,a+k+1,cmp);//从大到小排序 
    j=1;
    for(i=n-1;i>=0;i--)
    {
        if(book[i]==0)//这一时刻无任务
            dp[i]=dp[i+1]+1;
        else
        {
            for(int m=1;m<=book[i];m++)//i这一时刻有多少个任务 
            {
                dp[i]=max(dp[i],dp[i+a[j].l]);
                j++;
            }
        }
    }
    cout<<dp[0]<<endl; 
}
int main()
{
    solve();
}

猜你喜欢

转载自www.cnblogs.com/lyhhahaha/p/9976378.html