P1107 [BJWC2008] 雷涛的小猫

链接

https://www.luogu.com.cn/problem/P1107

题目

思路


因为在取h+delta的max时会一直遍历,所以直接加个记忆,就不用一直遍历了。

代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<map>
#include<string.h>
#include<limits.h>
#include<string>
#include<vector>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
#define int long long 
const int N = 2010;
int tree[N][N];//先是树再是高
int id[N];
int dp[N][N];//先是树再是高
signed main()
{
	IOS;
	int n, h, d;
	cin >> n >> h >> d;
	for (int i = 1; i <= n; i++)
	{
		int x; cin >> x;
		for (int j = 1; j <= x; j++)
		{
			int nwo; cin >> nwo;
			tree[i][nwo]++;
		}
	}
	for (int i = 1; i <= n; i++)dp[i][h] = tree[i][h];
	for (int i = h; i >= 0; i--)
	{
		int maxn = 0;
		for (int j = 1; j <= n; j++)
		{
			if (i > h - d or id[i + d] == j)dp[j][i] = dp[j][i + 1] + tree[j][i];//记忆的运用
			else dp[j][i] = max(dp[j][i + 1] + tree[j][i], dp[id[i + d]][i + d] + tree[j][i]);
			if (dp[j][i] > maxn)
			{
				maxn = dp[j][i];//记忆
				id[i] = j;
			}
		}
		
	}
	cout << dp[id[0]][0];

	return 0;
}


posted @ 2025-02-14 21:58  WHUStar  阅读(8)  评论(0)    收藏  举报