这道题
先思考简单情况,再将子问题转化为简单情况
在保证最优解可以构造出来的情况下弱化条件
的方法很值得借鉴。
但这里要讲其时间上的优化方法。
fij
表示到第j个点放置了i个邮局的最优解。若满足:
fi1,j1+fi2,j2<=fi1,j2+fi2,j1
且
i1<j1<i2<j2
则每一个 fi,j 的从 fi,k 转移过来时,k随着i、j单调。
若用
si,j
表示
fi,j
的值被
fi,si,j
更新,则有如下形式:
si−1,j<=si,j<=si,j+1
在第二维枚举的时候,可以利用这个性质将复杂度从
O(n)
降到常数,整体复杂度从
O(n3)
降到
O(n2)
。
用打表验证每一个 fi,j 被转移的对象,观察单调性,就可以验证此题是否满足四边形不等式了。
for(i=1;i<=M;i++)
{
s[i][N+1]=N;
for(j=N;j>=i;j--)
{
for(k=s[i-1][j];k<=s[i][j+1];k++)
{
tmp=f[i-1][k]+dis[k+1][j];
if(tmp<f[i][j])s[i][j]=k,f[i][j]=tmp;
}
}
}