1270: [BeijingWc2008]雷涛的小猫
Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 1351 Solved: 716
[Submit][Status][Discuss]
Description
![技术分享图片](http://www.lydsy.com/JudgeOnline/images/1270/1.jpg)
![技术分享图片](http://www.lydsy.com/JudgeOnline/images/1270/2.jpg)
Input
![技术分享图片](http://www.lydsy.com/JudgeOnline/images/1270/3.jpg)
Output
![技术分享图片](http://www.lydsy.com/JudgeOnline/images/1270/4.jpg)
Sample Input
![技术分享图片](http://www.lydsy.com/JudgeOnline/images/1270/5.jpg)
Sample Output
HINT
Source
很简单的dp,f1[i]表示高度为i的时候的最大值,f2[i][j]表示小猫在第i个柱子高度为j的时候的最大值,j这一维可以随着高度的枚举而省去
![技术分享图片](/img/jia.gif)
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 inline int read(){ 5 int x=0;int f=1;char ch=getchar(); 6 while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();} 7 while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();} 8 return x*f; 9 } 10 const int MAXN=1e4+10; 11 namespace zhangenming{ 12 int f1[5010]={},f2[5100]={},map[5010][2010],n,h,dep; 13 void init(){ 14 n=read();h=read();dep=read(); 15 for(int i=1;i<=n;i++){ 16 int xx=read(); 17 for(int j=1;j<=xx;j++){ 18 int yy=read(); 19 map[i][yy]++; 20 } 21 } 22 } 23 void dp(){ 24 for(int i=h;i>=1;i--){ 25 for(int j=1;j<=n;j++){ 26 f2[j]=max(f2[j],f2[j]+map[j][i]); 27 f2[j]=max(f1[i+dep]+map[j][i],f2[j]); 28 f1[i]=max(f1[i],f2[j]); 29 } 30 } 31 cout<<f1[1]<<endl; 32 } 33 } 34 int main(){ 35 using namespace zhangenming; 36 init(); 37 dp(); 38 return 0; 39 }