제출 #48612

#제출 시각아이디문제언어결과실행 시간메모리
48612faishol27수열 (APIO14_sequence)C++14
0 / 100
118 ms2248 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, ll> pl; typedef pair<int, int> pi; #define fi first #define se second const int MAXN = 1e3+5; const int MAXK = 205; // f(x,y) = score // x = pemotongan ke-x // y = indeks pemotongan // // int N, K; int data[MAXN], pref[MAXN], suff[MAXN]; int dp[MAXK][MAXN], ans=0; int tambah[MAXK][MAXN]; stack<int>putus; void cariSkenario(int cnt, int str, int score){ if(cnt == 0) return; for(;str>0;str--){ if(dp[cnt][str] == score){ putus.push(str); cariSkenario(cnt-1, str-1, score-tambah[cnt][str]); break; } } } void DFS(int pos){ if(pos == 1) return; putus.push(tambah[pos][putus.top()]); DFS(pos-1); } int main(){ memset(data, 0, MAXN); memset(pref, 0, MAXN); memset(suff, 0, MAXN); memset(dp, -1, sizeof dp); for(int i=0;i<MAXN;i++) dp[0][i] = 0; for(int i=0;i<MAXK;i++) dp[i][0] = 0; cin >> N >> K; for(int i=1;i<=N;i++){ cin >> data[i]; pref[i] = data[i]+pref[i-1]; } for(int i=N;i>0;i--){ suff[i] = suff[i+1]+data[i]; } for(int i=1; i<=K; i++){ for(int j=1;j<N;j++){ if(j < i) continue; for(int l=0;l<j;l++){ int tmp = dp[i-1][l]+(pref[j]-pref[l])*suff[j+1]; if(dp[i][j] <= tmp){ dp[i][j] = tmp; tambah[i][j] = l; } } } } for(int i=1;i<N;i++) ans = max(ans, dp[K][i]); for(int i=N-1;i>0;i--){ if(ans == dp[K][i]){ putus.push(i); break; } } DFS(K); cout << ans << endl; cout << putus.top(); putus.pop(); while(!putus.empty()){ cout << " " << putus.top(); putus.pop(); } cout << endl; }
#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...