这题40pts是什么鬼呀?
查看原帖
这题40pts是什么鬼呀?
90972
shitbro楼主2021/3/13 10:42
#include <iostream>
#include <cstring>
#define int long long
using namespace std;

const int N = 55;
int f[N][N][N],Max[N][N],Min[N][N],lg[N];
int MAX(int l,int r) {
	return max(Max[l][lg[r - l + 1]],Max[r - (1 << lg[r - l + 1]) + 1][lg[r - l + 1]]);
}
int MIN(int l,int r) {
	return min(Min[l][lg[r - l + 1]],Min[r - (1 << lg[r - l + 1]) + 1][lg[r - l + 1]]);
}
int calc(int i,int j,int l,int r) {
	return (max(MAX(i,l - 1),MAX(r + 1,j)) - min(MIN(i,l - 1),MIN(r + 1,j))) 
	* (max(MAX(i,l - 1),MAX(r + 1,j)) - min(MIN(i,l - 1),MIN(r + 1,j)));
} 
signed main () {
	int n; cin >> n;
	int a,b; cin >> a >> b;
	lg[1] = 0;
	int w;
	for(int i = 1;i <= n;i ++) cin >> w,Max[i][0] = Min[i][0] = w;
	for(int i = 2;i <= n;i ++) lg[i] = lg[i >> 1] + 1;
	for(int j = 1;j <= 6;j ++) {
		for(int i = 1;i + (1 << j) - 1 <= n;i ++) {
			Max[i][j] = max(Max[i][j - 1],Max[i + (1 << (j - 1))][j - 1]);
			Min[i][j] = min(Min[i][j - 1],Min[i + (1 << (j - 1))][j - 1]);
		}
	}
	memset(f,0x3f,sizeof f);
	for(int i = 1;i <= n;i ++) {
		for(int j = i;j <= n;j ++) {
			f[i][j][1] = (MAX(i,j) - MIN(i,j)) * (MAX(i,j) - MIN(i,j)); 
		}
	}
	for(int len = 2;len <= n;len ++) {
		for(int i = 1;i + len - 1 <= n;i ++) {
			int j = i + len - 1;
			for(int l = i + 1;l < j;l ++) {
				for(int r = l;r < j;r ++) {
					for(int k = 2;k <= j - i + 1;k ++) {
						f[i][j][k] = min(f[i][j][k],f[l][r][k - 1] + calc(i,j,l,r));
					}
				}
			}	
			for(int l = i + 1;l <= j;l ++) {
				for(int k = 2;k <= j - i + 1;k ++) 
					f[i][j][k] = min(f[i][j][k],f[l][j][k - 1] + (MAX(i,l - 1) - MIN(i,l - 1)) * (MAX(i,l - 1) - MIN(i,l - 1)));
			}
			for(int r = j - 1;r >= i;r --) {
				for(int k = 2;k <= j - i + 1;k ++) {
					f[i][j][k] = min(f[i][j][k],f[i][r][k - 1] + (MAX(r + 1,j) - MIN(r + 1,j)) * (MAX(r + 1,j) - MIN(r + 1,j)));
				}
			}
		}
	}
	int res = 1e18; 
	for(int i = 1;i <= n;i ++) {
		res = min(res,a * i + b * f[1][n][i]);
	}
	cout << res << endl;
	return 0; 
}
2021/3/13 10:42
加载中...