제출 #93231

#제출 시각아이디문제언어결과실행 시간메모리
93231emil_physmath수열 (APIO14_sequence)C++17
39 / 100
2061 ms69476 KiB
#include <iostream>
using namespace std;
const long long MAXN=100001, MAXK=301;

long long a[MAXN], prefSum[MAXN], dp[MAXN][MAXK], lt[MAXN][MAXK];

long long sum(long long l, long long r);
int main()
{
	long long n, k;
	cin>>n>>k;
	for (long long i=0; i<n; i++)
		cin>>a[i];
	prefSum[0]=a[0];
	for (long long i=1; i<n; i++) prefSum[i]=prefSum[i-1]+a[i];
	for (long long i=0; i<n; i++)
	{
		dp[i][0]=0;
		lt[i][0]=-1;
		for (long long curk=1; curk<=min(k, i); curk++)
		{
			for (long long prevSpl=0; prevSpl<i; prevSpl++)
				if (dp[prevSpl][curk-1]+sum(0, prevSpl)*sum(prevSpl+1, i)>dp[i][curk])
				{
					dp[i][curk]=dp[prevSpl][curk-1]+sum(0, prevSpl)*sum(prevSpl+1, i);
					lt[i][curk]=prevSpl;
				}
				/*
				cout<<"dp["<<i<<"]["<<curk<<"] = "<<dp[i][curk]<<'\t';
				cout<<"lt["<<i<<"]["<<curk<<"] = "<<lt[i][curk]<<'\n';
				*/
		}
	}
	cout<<dp[n-1][k]<<'\n';
	long long cur=n-1;
	while (k)
	{
		cur=lt[cur][k];
		k--;
		cout<<cur+1<<' ';
	}
	cout<<'\n';

	char I;
	cin >> I;
	return 0;
}

long long sum(long long l, long long r)
{
	return l ? prefSum[r]-prefSum[l-1] : prefSum[r];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...