洛谷 P1280 尼克的任務 (線性DP)
阿新 • • 發佈:2018-11-26
題意概括
線性資源分配的問題,因為空閒的時間大小看後面的時間(反正感覺這個就是個套路)所以從後往前DP。
轉移方程
如果當前時刻沒有工作
f[i]=f[i+1]+1
如果當前時刻有工作
f[i]=max(f[i],f[i+時間段])
完整程式碼
#include <bits/stdc++.h> using namespace std; map<int,int> f,sum; int p; struct node { int ks,js; }num[10005]; bool cmp(node a,node b) { return a.ks>b.ks; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,k; cin>>n>>k; for(int i=0;i<k;i++) cin>>num[i].ks>>num[i].js,sum[num[i].ks]++; sort(num,num+k,cmp); for(int i=n;i;i--) { if(!sum[i]) f[i]=f[i+1]+1; else for(int j=0;j<sum[i];j++) f[i]=max(f[i],f[i+num[p++].js]); } cout<<f[1]; }