제출 #997343

#제출 시각아이디문제언어결과실행 시간메모리
997343vjudge1수열 (APIO14_sequence)C++17
0 / 100
67 ms131072 KiB
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N = 1e5 + 5, K = 205;
const ll inf = 1e18;
vector<vector<ll> > dp(K, vector<ll>(N) ), path = dp;
vector<ll> pref(N);

void compute(int k, int l, int r, int s, int e)
{
  if(r <= l) return;
  
  int mid = (l + r) / 2;
  int bestj = s;
  for(int i = s; i <= min(e, mid - 1); i++)
    {
      ll val = dp[k - 1][i] + (pref[mid] - pref[i]) * pref[i];
      if(val > dp[k][mid])
	dp[k][mid] = val, bestj = i;
    }
  path[k][mid] = bestj;
  compute(k, l, mid, s, bestj);
  compute(k, mid + 1, r, bestj, e);
}

int main()
{
  int n, k;
  cin >> n >> k;
  pref[0] = 0;
  for(int i = 1; i <= n; i ++)
    {
      int x; cin >> x;
      pref[i] = pref[i - 1] + x;
    }
  dp[0][0] = -inf;
  for(int i = 1; i <= k; i++)
    for(int j = 0; j <= n; j++)
      dp[i][j] = -inf;

  for(int i = 1; i <= k; i++) {
    // compute(i, 0, n+1, 0, n+1);
    for(int j = 0; j <= n; j++)
      for(int l = 0; l < j; l++)
	if(dp[i - 1][l] != -inf)
	  {
	    ll val = dp[i - 1][l] + pref[l] * (pref[j] - pref[l]);
	    if(val >= dp[i][j])
	      dp[i][j] = val, path[i][j] = l;
	  }
  }
  
  cout << dp[k][n] << endl;

  int cur = n;
  vector<int> ans = {};
  int j = k;
  while(j--)
    {
      cur = path[j + 1][cur];
      ans.push_back(cur);
    }
  reverse(ans.begin(), ans.end());
  for(int i : ans)
    cout << i << ' ';
  cout << endl;
  return 0;
}
#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...