Submission #37791

#TimeUsernameProblemLanguageResultExecution timeMemory
37791MatheusLealVSplit the sequence (APIO14_sequence)C++14
33 / 100
9 ms36724 KiB
#include <bits/stdc++.h> #define int long long #define N 10005 #define K 220 #define f first #define s second #define inf 2000000000 using namespace std; typedef pair<int, int> pii; int n, k, v[N], dp[N][K], sum[N], prox[N][K]; int solve(int ini, int k) { if(k >= n - ini + 1) return 0; if(ini == n || k <= 0) return 0; if(dp[ini][k] != -1) return dp[ini][k]; for(int mid = ini ; mid < min(ini + 200, n); mid ++) { int custo = (sum[mid] - sum[ini - 1])*( sum[n] - sum[mid] ); int filhos = solve(mid + 1, k - 1); if( filhos + custo > dp[ini][k] ) { dp[ini][k] = filhos + custo; prox[ini][k] = mid; } } for(int mid = max(ini, n - 200) ; mid < n; mid ++) { int custo = (sum[mid] - sum[ini - 1])*( sum[n] - sum[mid] ); int filhos = solve(mid + 1, k - 1); if( filhos + custo > dp[ini][k] ) { dp[ini][k] = filhos + custo; prox[ini][k] = mid; } } return dp[ini][k]; } void print(int ini, int k) { if(!prox[ini][k]) return; cout<<prox[ini][k]<<" "; print(prox[ini][k] + 1, k - 1); } int32_t main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>k; for(int i = 1; i <= n; i++) cin>>v[i], sum[i] = sum[i - 1] + v[i]; memset(dp, -1, sizeof dp); cout<<solve(1, k)<<"\n"; print(1, k); cout<<"\n"; }
#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...