比赛 2024国庆练习3 评测结果 AAAAAAAAAAAAAAAAEEEEEEEEE
题目名称 划分 最终得分 64
用户昵称 wdsjl 运行时间 13.819 s
代码语言 C++ 内存使用 126.06 MiB
提交时间 2024-10-06 16:49:07
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

const LL INF = 0x3f3f3f3f3f3f3f3f;
const int MAXN = 5005;

template<typename _T>
_T MIN( const _T a, const _T b )
{
	return a < b ? a : b;
} 

int N,tp;
LL f[MAXN][MAXN];
LL s[MAXN];

int main(){
	freopen("2019partition.in","r",stdin); 	
	freopen("2019partition.out","w",stdout);
	cin>>N>>tp;
	for(int i=1;i<=N;i++){
		scanf("%lld",&s[i]);
		s[i]+=s[i-1];
	}
	for(int i=1;i<=N;i++)f[1][i]=s[i]*s[i];
	for(int i=2;i<=N;i++)
		for(int j=1;j<=N;j++)
			f[i][j]=INF;
	LL mn; 
	int l;
	for(int i=2;i<=N;i++){
		mn=INF,l=i;
		for(int j=i;j<=N;j++){
			while(l&&s[i-1]-s[l-1]<=s[j]-s[i-1]){
				mn=MIN(mn,f[l][i-1]);
				l--;
			}
			f[i][j]=mn+(s[j]-s[i-1])*(s[j]-s[i-1]);
		}
	}
	LL res=INF;
	for(int i=1;i<=N;i++)res=MIN(res,f[i][N]);
	printf("%lld",res);
	return 0;
}