题目描述
一只猴子找到了很多香蕉树,这些香蕉树都种在同一直线上,而猴子则在这排香蕉树的第一棵树上。这只猴子当然想吃尽量多的香蕉,但它又不想在地上走,只想从一棵树跳到另一棵树上.同时猴子的体力有限,它不能一次跳得太远或跳得次数太多,每当他跳到一棵树上,就会把那棵树上的香蕉都吃掉。那么,它最多能吃多少个香蕉呢?
分析
定义为到达第i棵树,跳了j次所获最多的香蕉个数。由定义,不容易推出方程:
从可以到达第i棵树的树更新过来。初始化,因为一开始在第1棵树上。
代码
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
long long f[105][105];
long long a[105],b[105],d,n,m;
int main() {
scanf("%lld%lld%lld",&n,&d,&m);
for (int i=1;i<=n;i++)
scanf("%lld%lld",&a[i],&b[i]);
memset(f,-0x3f,sizeof f);
long long ans=a[1];
f[1][0]=a[1];
for (int i=2;i<=n;i++) {
for (int j=1;j<=m;j++) {
for (int k=i-1;k>=1;k--) {
if (b[i]-b[k]<=d) f[i][j]=max(f[i][j],f[k][j-1]+a[i]);
else break;
}
ans=max(ans,f[i][j]);
}
}
printf("%lld",ans);
return 0;
}