【学习笔记】P1107 [BJWC2008]雷涛的小猫 - 题解

题目传送门

正解

思路

简单 DP

每次考虑这个位置是通过直接向下跳或者跳 Delta 个位置转移过来的情况。

但是我们会发现,我们需要枚举前 Delta 个位置找到最大值,不过,这个可以在处理每一层的时候顺便搞出来

总复杂度 \(O(NH)\)

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
int n,h;
inline int R(){
	int x=0,f=1;char c='c';
	while(c>'9'||c<'0'){f=f*(c=='-'?-1:1);c=getchar();}
	while(c<='9'&&c>='0'){x=x*10+c-'0';c=getchar();}
	return x*f;
}
int De,qw,wq;
int shi[2333][5333];
int ans[2333][5333];
int maxax[5333],mami;
int main(){
	n=R();h=R();De=R();
	for(int i=1;i<=n;++i){
		qw=R();
		for(int j=1;j<=qw;++j){
			wq=R();
			shi[i][wq]++;
		}
	} 
	for(int i=h;i>=1;--i){
		for(int j=1;j<=n;++j)
		ans[j][i]=max(ans[j][i+1],maxax[i+De])+shi[j][i];
		for(int j=1;j<=n;++j) maxax[i]=max(maxax[i],ans[j][i]);
	}
	printf("%d\n",maxax[1]);
	return 0;
}
上一篇:数组


下一篇:JAVA--一维数组