深入解析:P1107题解
这道题题目是一道考察预处理+普通DP的题目.做这道题大家可以想到设计状态为 dp[i][j]表示在第i棵树高度为j的位置时最多能获得的柿子.我们根据题目得出转移方程:1-n的任意数.就是,其中q可以
我们枚举i,j和q,这样的三重循环得O(n^3).我们发现这样的复杂度是无法接受的.我们考虑优化DP.怎么优化呢?很简单.我们知道d是一个定值,而q是具体什么数我们根本不在乎,因此我们预处理一个pre数组表示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<
浙公网安备 33010602011771号