[BZOJ1270][BeijingWc2008]雷涛的小猫

Solution 

  开始以为是贪心,想了1h想不出来正确的贪心策略。无奈看题解,发现是个很水的DP!!!

  这告诉我思路一错是多么恐怖。。。

  代码挺巧妙的,要滚动数组优化及记每层的maxl值。

  Code

#include<bits/stdc++.h>
using namespace std;
const int N=2005;
int n,h,d,ans,a[N][N],dp[N],maxl[N];
inline int read(){
    int x=0;char ch=0;
    while(!isdigit(ch)) ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return x;
}
int main(){
    n=read(),h=read(),d=read();
    for(int i=1;i<=n;++i){
        int ni=read();
        while(ni--) ++a[i][read()];
    }
    for(int i=h;i>=1;--i){
        for(int j=1;j<=n;++j) 
            dp[j]=max(dp[j],i+d<=h?maxl[i+d]:0)+a[j][i],
            maxl[i]=max(maxl[i],dp[j]);
        ans=max(ans,maxl[i]); 
    } 
    cout<<ans<<endl;
    return 0;
}
BZOJ1270

 

posted @ 2019-07-25 18:41  青君  阅读(114)  评论(0编辑  收藏  举报