# HDU3480 Division——四边形不等式或斜率优化

## 思路

$\Large f(i,j)=min(f(i-1,k-1)+(a_j-a_k)^2)$

## 证明w满足四边形不等式

$w(i,j)-w(i+1,j)=(a_j-a_i)^2-(a_j-a_{i+1})^2=a_i^2-a_{i+1}^2+2*a_j*(a_{i+1}-a_i)$

## 证明f满足四边形不等式

1.如果$k\le t$

$f(i,j)+f(i^{'},j^{'})\le f(i-1,k-1)+w(k,j^{'})+f(i^{'}-1,t-1)+w(t,j)$

2.如果$k\gt t$

$t_1=s(i^{'}-1,t-1),t_2=s(i^{'}-2,t_1-1)……t_n=s(i^{'}-n,t_{n-1}-1)$

## 证明$f(i,j)$的决策$s(i,j)$是单调的

1.设$k=s(i,j)$,对于所有$t\le k$

2.设$k=s(i,j)$,对于所有$t\le k$

## 代码

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 10005
#define maxm 5005
int f[maxm][maxn],s[maxm][maxn],a[maxn];
void work(){
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",a+i);
sort(a+1,a+n+1);
memset(f,0x3f,sizeof(f));
for(int i=1;i<=n;i++)s[0][i]=1;
f[0][0]=0;
for(int i=1;i<=m;i++){
f[i][i]=0;s[i][i]=i;s[i][n+1]=n;
for(int j=n;j>i;j--){
for(int k=s[i-1][j];k<=s[i][j+1];k++){
if(f[i][j]>f[i-1][k-1]+(a[j]-a[k])*(a[j]-a[k])){
f[i][j]=f[i-1][k-1]+(a[j]-a[k])*(a[j]-a[k]);
s[i][j]=k;
}
}
}
}
printf("%d\n",f[m][n]);
}
int main(){
int t;scanf("%d",&t);
for(int i=1;i<=t;i++)printf("Case %d: ",i),work();
return 0;
} 

## 代码

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 10005
#define inf 0x3fffffff
int f[2][maxn],a[maxn],que[maxn],s,t,k;
int calc(int k,int i,int j){
if(a[i]==a[j])return inf;
return (f[k][i-1]+a[i]*a[i]-f[k][j-1]-a[j]*a[j]-1)/((a[i]-a[j])<<1)+1;//ÏòÉÏÈ¡Õû
}
void insert(int k,int x){
while(s<t-1&&calc(k,x,que[t-1])<=calc(k,que[t-1],que[t-2]))t--;
que[t++]=x;
}
void work(){
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",a+i);
sort(a+1,a+n+1);
s=t=0;que[t++]=1;
for(int i=1;i<=m;i++){
k=i&1;f[k][i]=0;
for(int j=i+1;j<=n;j++){
while(s<t-1&&calc(k^1,que[s+1],que[s])<=a[j])s++;
int x=que[s];
f[k][j]=f[k^1][x-1]+(a[j]-a[x])*(a[j]-a[x]);
}
s=t=0;
for(int j=i+1;j<=n;j++){
insert(k,j);
}
}
printf("%d\n",f[m&1][n]);
}
int main(){
int t;scanf("%d",&t);
for(int i=1;i<=t;i++)printf("Case %d: ",i),work();
return 0;
}

posted @ 2018-05-21 08:10  Bennettz  阅读(331)  评论(0编辑  收藏  举报