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;
}