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;
}
posted @ 2023-12-14 17:14  Nijika  阅读(17)  评论(0)    收藏  举报