1. 程式人生 > >洛谷P1280 尼克的任務 動態規劃

洛谷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(); }