제출 #92512

#제출 시각아이디문제언어결과실행 시간메모리
92512davitmargSplit the sequence (APIO14_sequence)C++17
22 / 100
2075 ms132080 KiB
/*
DEATH-MATCH
Davit-Marg
*/
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <iterator>
#include <ctype.h>
#include <stdlib.h>  
#include <cassert>
#include <fstream>  
#define mod 998244353ll
#define LL long long
#define LD long double
#define MP make_pair
#define PB push_back
using namespace std;
int n,k,st;
LL a[100005],pr[100005],dp[202][202][202];
pair<int, int> nxt[202][202][202];
LL sum(int l, int r)
{
	return pr[r] - pr[l - 1];
}

void dfs(int l,int r,int k)
{
	if (k == 0)
		dp[l][r][k] = 0;
	if (dp[l][r][k] != -1)
		return;
	k--;
	for (int i = l; i < r; i++)
		for (int j = 0; j <= k && j < (i - l + 1) && k - j < r - i; j++)
		{
			dfs(l,i,j);
			dfs(i+1,r,k-j);
			LL d = sum(l, i)*sum(i + 1, r) + dp[l][i][j] + dp[i + 1][r][k - j];
			if (d > dp[l][r][k + 1])
			{
				dp[l][r][k + 1] = d;
				nxt[l][r][k + 1] = MP(i,j);
			}
		}
}

void print(int l,int r,int k)
{
	if (k <= 0)
		return;
	pair<int, int> p = nxt[l][r][k];
	cout << p.first << " ";
	k--;
	print(l,p.first,p.second);
	print(p.first + 1, r, k - p.second);
}

int main()
{
	cin >> n >> k;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		pr[i] = pr[i - 1] + a[i];
	}
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			for (int p = 1; p <= k; p++)
				dp[i][j][p] = -1;
	dfs(1,n,k);
	cout << dp[1][n][k] << endl;
	print(1, n, k);
	cout << endl;
	return 0;
}

/*

7 3
4 1 3 4 0 2 3 


*/
#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...