#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <string>
/*
有向线段k值问题:
给定一条有向直线 L 以及 L 上的 n+1 个点 x0 < x1 < x2 < …< xn 。有向直线 L 上的每个点 xi 都有一个权 w(xi);每条有向边(xi ,xi-1) ,
也都有一个非负边长 d(xi ,xi-1)。有向直线 L 上的每个点xi 可以看作客户,其服务需求量为w(xi) 。
每条边(xi ,xi-1) 的边长 d(xi ,xi-1) 可以看作运输费用。如果在点 xi 处未设置服务机构,
则将点xi 处的服务需求沿有向边转移到点 xj 处服务机构需付出的服务转移费用为w(xi)*d(xi ,xj) 。
已知在点 x0 处设置了服务机构,求要在直线 L 上增设 k 处服务机构,使得整体服务转移费用最小的费用。
其他变量说明:
d(i,j):节点i到节点j之间的距离
m(i,j):节点j的需求转移到节点i的费用
m(i,j)=w(j) * d(i,j)
状态数组:cost[i][j]:表示在第i个节点之后再增设j个服务机构的费用最小值(第i个节点已经被设置为服务机构)
目标状态:cost[0][k]
边界状态:
cost[i][j]=0,i+j>=n时,表示在第i个节点之后增设的服务机构数量大于剩下所能提供服务结构的节点数,这是无效状态
cost[i][j]=m(t,i)的累加和,t从i+1到n ,j=0时,表示第i个节点为增设的最后一个服务点,则从第i+1到n个节点的转移费用之后
,都是相对于第i个节点而言
cost[i][j]=min{cost[t][j-1] + m[k][i]的累加和,k从[i+1,t-1],t从[i+1,n-(j-1)]} ,
算法设计与分析:第四章 动态规划 4.7 有向线段k值问题
最新推荐文章于 2022-10-20 22:10:09 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)