1270: [BeijingWc2008]雷涛的小猫
Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 1351 Solved: 716
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT
Source
很简单的dp,f1[i]表示高度为i的时候的最大值,f2[i][j]表示小猫在第i个柱子高度为j的时候的最大值,j这一维可以随着高度的枚举而省去
#include <bits/stdc++.h> #define ll long long using namespace std; inline int read(){ int x=0;int f=1;char ch=getchar(); while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} return x*f; } const int MAXN=1e4+10; namespace zhangenming{ int f1[5010]={},f2[5100]={},map[5010][2010],n,h,dep; void init(){ n=read();h=read();dep=read(); for(int i=1;i<=n;i++){ int xx=read(); for(int j=1;j<=xx;j++){ int yy=read(); map[i][yy]++; } } } void dp(){ for(int i=h;i>=1;i--){ for(int j=1;j<=n;j++){ f2[j]=max(f2[j],f2[j]+map[j][i]); f2[j]=max(f1[i+dep]+map[j][i],f2[j]); f1[i]=max(f1[i],f2[j]); } } cout<<f1[1]<<endl; } } int main(){ using namespace zhangenming; init(); dp(); return 0; }