| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> Acwing 274. 移动服务(线性DP) -> 正文阅读 |
|
[数据结构与算法]Acwing 274. 移动服务(线性DP) |
一个公司有三个移动服务员,最初分别在位置?1,2,3 处。 如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个地方去。 某一时刻只有一个员工能移动,且不允许在同样的位置出现两个员工。 从?pp?到?qq?移动一个员工,需要花费?c(p,q)。 这个函数不一定对称,但保证?c(p,p)=0。 给出?NN?个请求,请求发生的位置分别为?p1~pN。 公司必须按顺序依次满足所有请求,且过程中不能去其他额外的位置,目标是最小化公司花费,请你帮忙计算这个最小花费。 输入格式 第?11?行有两个整数?L,N,其中?L?是位置数量,N 是请求数量,每个位置从?1?到?L?编号。 第?2?至?L+1 行每行包含?L?个非负整数,第?i+1 行的第?j?个数表示?c(i,j),并且它小于?2000。 最后一行包含?N?个整数,是请求列表。 一开始三个服务员分别在位置?1,2,3。 输出格式 输出一个整数?M,表示最小花费。 数据范围 3≤L≤200, 输入样例:
输出样例:
解题思路:状态表示:首先最有可能想到的是f[i][x][y][z],表示当前处理完第i个服务后,3个快递员的状态,但是通过计算时间和空间,200^3*1000=8e9,显然超出了时间和空间的限制,那就要开始想办法去优化状态表示,因为是处理完了第i个服务,所以此时一定有一个快递员站在第i个服务地点的位置,这样我们就可以省略一维数组,发现刚刚好。 状态计算:一般动态规划的状态计算大多是已知当前的状态,去找上一步状态,由那些状态可以得到当前的状态,但是我们分析一个这个题目,当前状态的前一步是会有很多种可能的,所以这里罕见地使用了另一种方法从当前的状态出发去更新能到达的下一个状态,现在我们已知f[i][x][y],要去得到下一个状态,令z=p[i],下一步就是要派遣一个快递员去往p[i+1]地点,那我们就有3种选择 1、派z去,就是f[i+1][x][y](x,y待在原位置不动)。 2、派x去,就是f[i+1][z][y](用z替换x的状态,此时x站在了p[i+1]位置上) 3、派y去,就是f[i+1][x][z](用z替换y的状态,此时y站在了p[i+1]位置上) 到最后一步,1个快递员站在了第p[n]个位置上,而其他2个快递员是随机的,所以枚举x,y,取f[n][x][y]中的最小值即可 上代码:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 3:46:52- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |