算法设计与分析:第四章 动态规划 4.7 有向线段k值问题

本文介绍了有向线段k值问题,该问题涉及在有向直线上寻找最佳的服务点位置,以使服务转移总费用最小。通过动态规划方法,计算每个点之后增设k个服务点的最小费用,并给出状态转移方程和递归函数实现。最后,通过记忆化搜索优化计算效率,并展示如何回溯找到增设的服务点路径。
摘要由CSDN通过智能技术生成
#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)]} ,
  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值