洛谷P1280 尼克的任務 動態規劃
阿新 • • 發佈:2018-11-19
把區間上的問題轉化為點上的問題,即把時間段上的問題轉化為時間點上的問題
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(); }