思路:
f[i][j]表示从盒子顶端取到了i,还剩下j个零食可获得最多的钱。
f[i][j]=max(f[i+1][j-1]+a[i]*(n-j+1),f[i][j-1]+a[i+j-1]*(n-j+1))
边界条件 f[i][1]=a[i]*n
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 2000
int n;
int a[maxn+5];
int f[maxn+5][maxn+5]= {0};
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
f[i][1]=a[i]*n;
}
for(int j=2; j<=n; j++) {
for(int i=n-j+1; i>=1; i--) {
f[i][j]=max(f[i+1][j-1]+a[i]*(n-j+1),f[i][j-1]+a[i+j-1]*(n-j+1));
}
}
printf("%d",f[1][n]);
return 0;
}
本文介绍了一种解决奶牛零食问题的动态规划方法。通过定义状态转移方程f[i][j]=max(f[i+1][j-1]+a[i]*(n-j+1),f[i][j-1]+a[i+j-1]*(n-j+1)),实现从盒子顶端取到i位置,剩余j个零食时能获取最多金钱的目标。边界条件为f[i][1]=a[i]*n。

被折叠的 条评论
为什么被折叠?



