Submission #1208792

#TimeUsernameProblemLanguageResultExecution timeMemory
1208792gatapdevK blocks (IZhO14_blocks)C++20
0 / 100
0 ms400 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[100001];
vector<int> dp_before(1001+1),dp_cur(1001+1); 
int C(int l,int r);
void compute(int l,int r,int optl,int optr);
signed main(){
	int n,K;
	cin>>n>>K;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		dp_before[i]=C(1,i);
	}
	for(int i=1;i<=K;i++){
		compute(0,n,0,n);
		dp_before=dp_cur;
	}
	cout<<dp_before[n];
}
int C(int l,int r){
	int ans=-1;
	for(int i=l;i<=r;i++) ans=max(ans,a[i]);
	return ans;
}
void compute(int l,int r,int optl,int optr){
	if(l>r) return;
	int mid=(l+r)>>1;
	pair<int,int> best={INT_MAX,-1};
	for(int k=optl;k<=min(mid,optr);k++){
		best=min(best,{dp_before[k-1]+C(k,mid),k});
	}
	dp_cur[mid]=best.first;
	int opt=best.second;
	compute(l,mid-1,optl,opt);
	compute(mid+1,r,opt,optr);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...