1. 程式人生 > >洛谷 P1280 尼克的任務 (線性DP)

洛谷 P1280 尼克的任務 (線性DP)

題意概括

線性資源分配的問題,因為空閒的時間大小看後面的時間(反正感覺這個就是個套路)所以從後往前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];
}