这道题
先思考简单情况,再将子问题转化为简单情况
在保证最优解可以构造出来的情况下弱化条件
的方法很值得借鉴。
但这里要讲其时间上的优化方法。
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;
}
}
}