P1107题解
题目链接
这道题题目是一道考察预处理+普通DP的题目.做这道题我们可以想到设计状态为 dp[i][j]表示在第i棵树高度为j的位置时最多能获得的柿子.我们根据题目得出转移方程:,其中q可以是1-n的任意数.
我们枚举i,j和q,这样的三重循环需要O(n^3).我们发现这样的复杂度是无法接受的.我们考虑优化DP.怎么优化呢?很简单.我们知道d是一个定值,而q是具体什么数我们根本不在乎,因此我们预处理一个pre数组表示i高度时最多能获得几个柿子.这样方程就会变为:
这样复杂度就会变为O(n^2).这就可以接受了.
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e3+10;
int n,h,d,a[N][N],x,y,pre[N],ma,dp[N][N];
signed main(){cin>>n>>h>>d;for(int i=1;i<=n;i++){cin>>x;for(int j=1;j<=x;j++) cin>>y, a[i][y]++;}for(int i=h;i>=0;i--){for(int j=1;j<=n;j++){dp[j][i]=max(dp[j][i+1]+a[j][i],pre[i+d]+a[j][i]);pre[i]=max(pre[i],dp[j][i]);}}for(int i=1;i<=n;i++) ma=max(ma,dp[i][0]);cout<<ma;return 0;
}