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