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

浙公网安备 33010602011771号