[USACO13DEC]牛奶调度Milk Scheduling

原题链接https://www.lydsy.com/JudgeOnline/problem.php?id=4096

容易想到的一个测略就是,优先考虑结束时间小的牛。所以我们对所有牛按照结束时间排序。然后我们发现前\(i\)头奶牛在时刻j的最大价值由前\(i-1\)头奶牛在时刻\(j-1\)的最大价值转移过来,那么考虑dp。

\(dp[i][j]\)表示前i头奶牛在时刻j的最大价值,那么我们有:

\[dp[i][j]=max(dp[i][j],dp[i-1][j-1]+g[i]); \]

然后考虑到空间问题,我们可以用滚动数组优化空间。或者直接改成一维数组,把循环倒过来即可。是不是很像背包

时间复杂度为\(O(N*{\sum}_{i=1}^{n}d[i])\)

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 10010
using namespace std;
 
inline int read(){
    register int x(0),f(1); register char c(getchar());
    while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }
    while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x*f;
}
 
pair<int,int> a[maxn];
int n,ans,dp[maxn];
 
int main(){
    n=read();
    for(register int i=1;i<=n;i++) a[i].second=read(),a[i].first=read();
    sort(a+1,a+1+n);
    for(register int i=1;i<=n;i++){
        for(register int j=a[i].first;j>=1;j--){
            dp[j]=max(dp[j],dp[j-1]+a[i].second);
            ans=max(ans,dp[j]);
        }
    }
    printf("%d\n",ans);
    return 0;
}
posted @ 2019-08-06 15:47  修电缆的建筑工  阅读(227)  评论(0编辑  收藏  举报