题目:奶牛零食 Treats for the Cows
思路:
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 2000int 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;
}