A*算法笔记

A算法笔记
如有错误,烦请指正,谢谢大家
A
是一种寻路算法,通常用来解决path finding problem,在A算法中,我们把地图划分成一个个小方格(其他图形也可以)。地图中包含起点、终点、障碍物等信息。我们通过A算法找出从起点到终点的路径,通过小方格一个位置一个位置的移动来到达终点。每个方格都有两个状态:可走状态和不可走状态,那些被障碍物占据的方格就成为不可走状态。A*算法中还包含Openlist和Closelist两个元素。
算法的大致过程
1、从起点开始,把起点和与起点相邻且可达的方格加入到openlist当中
2、把起点设为这些方格的父亲节点
3、把起点从Openlist中移除,并把它加入到closelist之中
4、计算组成路径方格,计算组成路径方格主要靠F=G+H,其中G为移动到指定方格的移动代价,可以设横竖移动代价为10,对角线移动代价为14(这样操作可以加快计算机的运算速度)H可以用曼哈顿距离来估算出来(移动格子的总数乘10)
5、把起点加入closelist中之后,我们选择F值最小的那个格子进行搜索
6、把这个格子从openlist中取出,检查所有与他相邻且可达的方格,若这些方格有在openlist中,则选择F值最小的那个进行搜索,若都不在,则把他们加入到openlist中去,
7、检查当前路径是否最优,即当前方格到所选方格G值是不是变小了,若没有不做任何操作,若变小了,重新计算那个方格的F值和G值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目描述 有 $n$ 种不同面额的硬币,每种硬币的数量无限。假设硬币面额为 $a_1,a_2,...,a_n$,现在要用这些硬币来找零 $m$ 元,求最少需要的硬币个数。 样例 输入:5,[1,2,5] 输出:2 算法1 (动态规划) $O(nm)$ 很明显,这是一道动态规划的问题。 设 $f[i][j]$ 为只考虑前 $i$ 种硬币,总面值为 $j$ 元时所需的最少硬币数。 显然,对于 $f[i][j]$,我们可以选择不取第 $i$ 种硬币,此时 $f[i][j]=f[i-1][j]$。也可以选择取第 $i$ 种硬币,此时 $f[i][j]=f[i][j-a_i]+1$。 于是,状态转移方程为: $$f[i][j]=\min(f[i-1][j],f[i][j-a_i]+1)$$ 注意,当 $j<a_i$ 时,显然不能取第 $i$ 种硬币,因此 $f[i][j]=f[i-1][j]$。 最终答案即为 $f[n][m]$。 时间复杂度 状态数为 $nm$,转移复杂度为 $O(1)$,故总时间复杂度为 $O(nm)$。 参考文献 无 C++ 代码 class Solution { public: int coinChange(vector<int>& coins, int amount) { int n = coins.size(); vector<vector<int>> f(n+1,vector<int>(amount+1,0x3f3f3f3f)); for(int i=0;i<=n;++i) f[i][0] = 0; for(int i=1;i<=n;++i){ for(int j=1;j<=amount;++j){ if(j<coins[i-1]) f[i][j] = f[i-1][j]; else f[i][j] = min(f[i-1][j],f[i][j-coins[i-1]]+1); } } return f[n][amount]>=0x3f3f3f3f?-1:f[n][amount]; } }; Java 代码 class Solution { public int coinChange(int[] coins, int amount) { int n = coins.length; int[][] f = new int[n+1][amount+1]; for(int i=0;i<=n;++i) f[i][0] = 0; for(int i=1;i<=n;++i){ for(int j=1;j<=amount;++j){ if(j<coins[i-1]) f[i][j] = f[i-1][j]; else f[i][j] = Math.min(f[i-1][j],f[i][j-coins[i-1]]+1); } } return f[n][amount]>=0x3f3f3f3f?-1:f[n][amount]; } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值