이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,k;
cin>>n>>k;
vector<long long>all(n+1);
for(int i=1;i<=n;i++){
cin>>all[i];
}
vector<vector<long long>>dp(n+3,vector<long long>(k+1));
vector<vector<long long>>dpa(n+3,vector<long long>(k+1));
vector<long long>ps(n+3),suf(n+3);
for(int i=1;i<=n;i++){
ps[i]=ps[i-1]+all[i];
}
for(int i=n;i>=1;i--){
suf[i]=all[i]+suf[i+1];
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=k;j++){
if(j==0){
dp[i][j]=0;
continue;
}
if(j==1){
dp[i][j]=ps[i]*suf[i+1];
dpa[i][j]=-1;
continue;
}
long long last=0;
for(int h=1;h<i;h++){
long long fake=dp[h][j-1]+(ps[i]-ps[h])*suf[i+1];
if(fake<last){
assert(0);
}
last=fake;
if(fake>dp[i][j]){
dp[i][j]=fake;
dpa[i][j]=h;
}
}
}
}
long long maxa=-1,w=0;
for(int i=1;i<=n;i++){
if(dp[i][k]>maxa){
w=i;
maxa=dp[i][k];
}
}
cout<<maxa<<"\n";
int now=k;
vector<int>res;
while(now>0){
res.push_back(w);
w=dpa[w][now];
now--;
}
reverse(res.begin(),res.end());
for(auto x:res){
cout<<x<<" ";
}
cout<<endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |