sgag

#include <bits/stdc++.h>
#define MAXN 1005
using namespace std;
unsigned long long  dis[MAXN][MAXN],w[MAXN],sum[MAXN];
int num[MAXN];
#define FZ(i,p)(dis[i-1][p]-w[p]+sum[p]*sum[p])
int i,p;
bool checkup(int i,int p1,int p2,int p3)
{
	int x1=sum[p1], x2=sum[p2], x3=sum[p3], y1=FZ(i,p1), y2=FZ(i,p2), y3=FZ(i,p3);
	if((y2-y3)*(x1-x2)<(y1-y2)*(x2-x3)) return 1;
	else return 0;
}
int que[MAXN],tail,head;
int n,m,j;
int main(){
	while(~scanf("%d%d",&n,&m)&&(n||m))
	{    
		
		memset(sum,0,sizeof (sum));
		memset(w,0,sizeof (w));
		for(i=1;i<=n;i++)
		{	
			scanf("%d",&num[i]);
			sum[i]=sum[i-1]+num[i];
			w[i]=w[i-1]+num[i]*sum[i-1];
		}
		for(i=1;i<=n;i++)
			dis[1][i]=w[i];
		for(i=2;i<=m+1;i++)
		{
			tail=head=1;
			que[tail++]=0;//
			for(j=1;j<=n;j++)
			{
				while(tail-1>head&&FZ(i,que[head+1])-FZ(i,que[head])<(sum[que[head+1]]-sum[que[head]])*sum[j])
					head++;
				int k=que[head];
				dis[i][j]=dis[i-1][k]+w[j]-w[k]+sum[k]*(sum[j]-sum[k]);
				while(tail-1>head&&checkup(i,j,que[tail-1],que[tail-2])==0)
				tail--;
				que[tail++]=j;	
			}
		
	}printf("%I64d\n",dis[m+1][n]);
}
}

  

猜你喜欢

转载自www.cnblogs.com/Lamboofhome/p/11588027.html
今日推荐