P2858 [USACO06FEB] Treats for the Cows G/S
P2858 [USACO06FEB] Treats for the Cows G/S
题目传送门
分析
我们只能从左或右拿,开始想的是直接拿,然后拿到最后算结果,但是发现拿第1个的时候是左1右1,拿2个的时候也可能是左1右1左2右2,那这么多过程怎么办呢?发现行不通
我们区间是小区间最后并到大区间,那我们可不可以反着想呢?我们从最后1个开始拿,那我们拿前一个的时候不就是只能从左或右开始了吗,那我们天数同样也要从后往前
状态转移
左或右选最大钱的可能
f[i][j] = max(f[i+1][j]+g[i]*d,f[i][j-1]+g[j]*d);
AC code
#include <bits/stdc++.h>
using namespace std;
int main(){
int g[2005],f[2005][2005]={},n;
cin >> n;
for(int i=1;i<=n;i++){
cin >> g[i];
}
for(int l=1;l<=n;l++){
for(int i=1;i+l-1<=n;i++){
int j = i+l-1;
int d = n-l+1;
f[i][j] = max(f[i+1][j]+g[i]*d,f[i][j-1]+g[j]*d);
}
}
cout << f[1][n];
return 0;
}

浙公网安备 33010602011771号