统计所有可行路径(动态规划)

给你一个 互不相同 的整数数组,其中 locations[i] 表示第 i 个城市的位置。同时给你 start,finish 和 fuel 分别表示出发城市、目的地城市和你初始拥有的汽油总量

每一步中,如果你在城市 i ,你可以选择任意一个城市 j ,满足  j != i 且 0 <= j < locations.length ,并移动到城市 j 。从城市 i 移动到 j 消耗的汽油量为 |locations[i] - locations[j]|,|x| 表示 x 的绝对值。

请注意, fuel 任何时刻都 不能 为负,且你 可以 经过任意城市超过一次(包括 start 和 finish )。

请你返回从 start 到 finish 所有可能路径的数目。

由于答案可能很大, 请将它对 10^9 + 7 取余后返回。

示例 1:

输入:locations = [2,3,6,8,4], start = 1, finish = 3, fuel = 5
输出:4
解释:以下为所有可能路径,每一条都用了 5 单位的汽油:
1 -> 3
1 -> 2 -> 3
1 -> 4 -> 3
1 -> 4 -> 2 -> 3
示例 2:

输入:locations = [4,3,1], start = 1, finish = 0, fuel = 6
输出:5
解释:以下为所有可能的路径:
1 -> 0,使用汽油量为 fuel = 1
1 -> 2 -> 0,使用汽油量为 fuel = 5
1 -> 2 -> 1 -> 0,使用汽油量为 fuel = 5
1 -> 0 -> 1 -> 0,使用汽油量为 fuel = 3
1 -> 0 -> 1 -> 0 -> 1 -> 0,使用汽油量为 fuel = 5
示例 3:

输入:locations = [5,2,1], start = 0, finish = 2, fuel = 3
输出:0
解释:没有办法只用 3 单位的汽油从 0 到达 2 。因为最短路径需要 4 单位的汽油。
 

提示:

2 <= locations.length <= 100
1 <= locations[i] <= 109
所有 locations 中的整数 互不相同 。
0 <= start, finish < locations.length
1 <= fuel <= 200

代码:

dp[i]即当有fuel的油量时在第i个位置可以到达的终点的路径总数,即dp[i][0]到dp[i][fuel]的路径数总和。

dp[i][j]表示的是第i个位置时剩余油量为j时的路径总数。

举个例子来说,起点是1,终点是2,那么我可以从1到2,也可以从1到3到2。

我们这样想,

1.dp[2][0]就是油量为0时到达2的路径数(油量为0,所以就在原地喽,这算作一种路径)。

2.dp[2][1]就是油量为1时到达2的路径数:dp[2][1]=dp[2][1]+dp[i][1-cost];即要算进去油量为0在原地的一种,还有加上在以除原点以外的其他点为终点时的路径数(就比如说我此时以3为终点,但我到达3后还有充足的油量到达1,那么在到达3后去往2的路径数就直接等于到达3的路径数,前提条件是到达3后的剩余油量能支持到达2。)

..........

而题目是要求在规定剩余油量为fuel的情况下从start到finish的路径数,那么就返回dp[start][fuel]就可以啦。

class Solution {
public:
    int countRoutes(vector<int>& locations, int start, int finish, int fuel) {
    int mod = 1e9+7;
    int m=locations.size();
    vector<vector<int>>dp(m,vector<int>(fuel+1,0));
    for(int i=0;i<fuel+1;i++)dp[finish][i]=1;
    for(int t=0;t<fuel+1;t++)
    {
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(j!=i)
                {
                int cost=abs(locations[i]-locations[j]);
                if(cost<=t)
                {
                    dp[i][t]=dp[i][t]+dp[j][t-cost];
                    dp[i][t]=dp[i][t]%mod;
                }
                }
            }
        }
    }
    return dp[start][fuel];
    }
};

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、选题背景 随着科技的不断发展,机器人技术逐渐成为了人们关注的热点之一。而在现代物流、制造、煤矿等行业中,巡检机器人已成为智能物流、智能制造、智能煤矿的重要组成部分。而基于巡检机器人导航技术中,路径规划是其中的关键环节之一。目前,市面上有很多路径规划算法,如A*算法、Dijkstra算法、RRT算法等。但这些算法都有其局限性,所以我们需要一种更加高效、精准的算法。 二、选题意义 本课题旨在提出一种基于双向长短时记忆网络(Bi-LSTM)的巡检机器人路径规划算法,该算法利用Bi-LSTM的高效性能和能力,可以更加准确地对巡检机器人路径进行规划。同时,该算法具有以下优点: 1. 准确性高:Bi-LSTM能够实现序列到序列的映射,可以更精准地对路径进行规划。 2. 效率高:Bi-LSTM采用并行运算,可以大幅度缩短路径规划所需时间。 3. 适应性强:Bi-LSTM能够适应不同巡检机器人的路径规划需求,使路径规划更加灵活。 三、研究内容 本课题的具体研究内容包括: 1. 分析巡检机器人路径规划问题,研究现有路径规划算法的优缺点。 2. 设计基于双向长短时记忆网络的巡检机器人路径规划算法,提高路径规划的准确性和效率。 3. 对算法进行编程实现并进行实验验证,评估算法的性能和可行性。 四、研究方法 本课题的研究方法主要包括: 1. 文献研究:对现有的巡检机器人路径规划算法进行分析、总结并提取其优缺点,为后续的算法设计提供参考。 2. 算法设计:依据巡检机器人的行动特点,设计适合该机器人路径规划需求的基于Bi-LSTM的路径规划算法。 3. 编程实现与实验验证:利用Python等编程语言实现算法,利用真实的机器人数据和统计分析方法对算法进行验证,评估算法的性能和可行性。 五、进度计划 本课题的进度计划如下: 阶段 | 工作内容 | 时间安排 --|--|-- 第一阶段 | 文献研究和算法设计 | 2022年10月-2023年3月 第二阶段 | 算法编程实现和实验验证 | 2023年4月-2023年9月 第三阶段 | 数据分析和性能评估 | 2023年10月-2024年1月 第四阶段 | 论文撰写及答辩 | 2024年2月-2024年5月 六、预期成果 本课题预期达到以下成果: 1. 设计出一种基于Bi-LSTM的巡检机器人路径规划算法,通过实验验证该算法的性能和可行性。 2. 对比该算法与传统的路径规划算法,得出该算法的优势和不足。 3. 提出该算法在巡检机器人等领域中的应用前景,并对路径规划领域提出一些建议。 4. 完成论文的撰写和答辩。 七、参考文献 [1] 秦华杰. 基于遗传算法和Dijkstra算法的路径规划及其应用研究[D]. 河南大学, 2006. [2] 张旭, 王恒鹏. 基于RL和A*算法的无人机路径规划研究[J]. 计算机工程与应用, 2020, 56(2): 60-66. [3] 徐伟, 何桂军, 刘手旺. 基于改进的A*算法的无人机路径规划[J]. 系统仿真学报, 2021, 33(1): 92-100. [4] Hochreiter S && Schmidhuber J. Long Short-Term Memory[J]. Neural Computation, 1997, 9(8): 1735-1780.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值