深入解析:P1107题解

题目链接

这道题题目是一道考察预处理+普通DP的题目.做这道题大家可以想到设计状态为 dp[i][j]表示在第i棵树高度为j的位置时最多能获得的柿子.我们根据题目得出转移方程:dp[i][j] = max(dp[i][j+1]+a[j][i],dp[q][j+d]+a[j][i])1-n的任意数.就是,其中q可以

我们枚举i,j和q,这样的三重循环得O(n^3).我们发现这样的复杂度是无法接受的.我们考虑优化DP.怎么优化呢?很简单.我们知道d是一个定值,而q是具体什么数我们根本不在乎,因此我们预处理一个pre数组表示i高度时最多能获得几个柿子.这样方程就会变为:

dp[i][j] = max(dp[i][j+1]+a[j][i],pre[j+d]+a[j][i])

这样复杂度就会变为O(n^2).这就可以接受了.

代码:

#include
#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>x;
for(int j=1;j>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<

posted on 2025-09-18 11:13  ljbguanli  阅读(3)  评论(0)    收藏  举报