[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; }
愿你有一天能和重要的人重逢