# 題目
AP325 Q-1-4. 支點切割
# 解題思路
目前沒東西...
# 程式碼
#include<bits/stdc++.h> | |
using namespace std; | |
#define N 50005 | |
typedef long long LL; | |
LL a[N],K,lps[N],rps[N];//ps:prefix sum | |
int cut(int l,int r,int k){ | |
if(k>K || r-l<2) | |
return 0; | |
LL buffer=0; | |
lps[l]=0;rps[r]=0; | |
for(int i=l+1;i<r;i++){ | |
buffer+=a[i-1]; | |
lps[i]=lps[i-1]+buffer; | |
} | |
buffer=0; | |
for(int i=r-1;i>l;i--){ | |
buffer+=a[i+1]; | |
rps[i]=rps[i+1]+buffer; | |
} | |
buffer=10e8+1; | |
int c; | |
for(int i=r-1;i>l;i--){ | |
LL sum; | |
sum=abs(lps[i]-rps[i]); | |
if(sum<=buffer){ | |
buffer=sum; | |
c=i; | |
} | |
} | |
return a[c]+cut(l,c-1,k+1)+cut(c+1,r,k+1); | |
} | |
int main(){ | |
int n; | |
cin>>n>>K; | |
for(int i=0;i<n;i++){ | |
cin>>a[i]; | |
} | |
cout<<cut(0,n-1,1); | |
return 0; | |
} |