机器人的运动范围 ### 解题思路
采用广度优先搜索的方式
广度优先通常采用队列的方式,以一种平铺的方式进行计算
移动方向:我们可以只定义向下和向右进行移动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 class Solution { public int movingCount(int m, int n, int k) { Deque<int[]> deque = new ArrayDeque<>();//定义一个队列,由于添加删除状态 int[] dx = {1, 0};//右移一位 int[] dy = {0, 1};//下移一位 boolean[][] vis = new boolean[m][n];//定义一个boolean二维数组用于确定该坐标是否被添加 vis[0][0] = true;//坐标[0][0]一定会被使用的,因此将其初始化为true deque.
n件物品,它们装入背包所占的容量分别为w1、w2……wn;它们所拥有的价值分别为p1、p2 ……p n; 有一个总容量为C的背包;
在装满背包的情况下,如何使得包内的总价值最大?
该问题的特点是:每个物品仅有一个,可以选择放或者不放,也就是说每个物品只能使用一次。
首先我们定义一个变量$B(i,j)$表示当背包容量为j,前i个物品(第1个到第i个)的情况下包内的最大价值。
即有i个物品,背包的容量为j,此时的包内的最大价值。
我们对每一件物品进行编号,可以列出以下表格:
行表示背包的容量,列表时背包的编号;为了便于操作,我们将0也加入了表格之中。
现在来分析$B(i,j)$的情况,首先明确一点,为了求出$B(i,j)$,我们可以利用之前的状态。 $$ B(i,j)=\left{ \begin{array}{lcl} B(i-1,j) &if &w[i]>j \
max{ [B(i-1,j)]; [B(i-1,j-w(i))+p(i)] } &if &w[i]<=j \end{array}\right. $$
对于情况$w[i]>j$表示第i个物品的重量大于背包容量,所以此时不能够放入第i个物品进背包内,只能够放弃,因此这种情况下只能够考虑前i-1个物品,即:$B(i-1,j)$ 对于第二种情况,当前背包能够放入第i个物品。这时我们需要考虑两种情况:1.放入第i个物品;2.不放入第i个物品;因此我们需要在这两种情况中选出一个最大值; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public class pack { public static void main(String[] args) { int[] w={0,2,3,4,5};//各物品体积 int[] p={0,1,2,5,6};//各物品价值 int c=8;//背包总容量 int x=w.
动态规划解题的4个步骤 定义子问题(重叠子问题) 写出子问题的递推关系 确定DP数组的计算顺序 空间优化(可选) 打家劫舍 采用一维数组的动态规划
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // 问题转化为:给定长度为n的数组,如何取最大的和(在满足条件的情况下) class Solution { public int rob(int[] nums) { int len=nums.length; if(len==0) return 0; if(len==1) return nums[0]; int[] dp=new int[len]; dp[0]=nums[0]; dp[1]=Math.max(nums[0],nums[1]); for(int i=2;i<len;i++){ dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i]); } return dp[len-1]; } } 打家劫舍 II 采用两个一维数组的动态规划
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 class Solution { public int rob(int[] nums) { int len = nums.
date: 2021-02-04T09:17:30+08:00
参考
可以采用动态规划的想法!
第n个丑数$x_n$,它必然为一下三种情况之一: $$ x_n= \left{ \begin{array}{rcl} x_a \times 2 \
x_b \times 3 \
x_c \times 5\
\end{array}\right. $$ 其中$x_a , x_b ,x_c $是未知数。
为了保证不会遗漏某个丑数,$x_n$必然等于: $$ x_n=min{x_a \times 2,x_b \times 3,x_c \times 5 } $$
这里我们需要明确的是一个丑数乘上2或3或5还是一个丑数
这里因为我们要在${x_a \times 2,x_b \times 3, x_c \times 5}$中挑选出最小的一个丑数,我们可以这样考虑,假设存在三个数组,分别用第一个丑数乘上2,3,5
1 2 3 4 5 6 7 nums2={1*2,2*2,3*2,4*2,5*2,6*2,8*2...} nums3={1*3,2*3,3*3,4*3,5*3,6*3,8*3...} nums5={1*5,2*5,3*5,4*5,5*5,6*5,8*5...} # 注意 7 不是丑数. # 2, 3, 5 这前 3 个丑数一定要乘以其它的丑数, 所得的结果才是新的丑数, 所以上例中没有出现 7*2, 7*3, 7*5 那么, 最终的丑数序列实际上就是这 3 个有序序列对的合并结果, 计算丑数序列也就是相当于 合并 3 个有序序列。 合并 3 个有序序列
参考
1 >>> 运算符会用0填充高位,这与 >> 不同,其会用符号位填充高位。不存在 <<< 运算符 例1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { /* * 采用位运算的方式 * 利用n与1进行与操作,即可判定n的最后一位是否为1,如果为1,res加1,否则不加 * 然后将n右移一位,知道n=0 * */ int res=0; while (n!=0){ res+=(n&1); n=n>>>1; } return res; } } 例2
Linux中tty是什么 tty:终端设备的统称。
tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。
tty1~6是文本型控制台,tty7是X Window图形显示管理器。
在本地机器上可以通过Ctrl+Alt+F1(F1-F7键)切换到对应的登录控制台。
所谓的窗口环境就是:文字界面加上X窗口软件!文字界面一定是存在的,只是窗口界面软件看你要不要启动而已
快捷键 Tab:命令和文件名补全; Ctrl+C:中断正在运行的程序; Ctrl+D:结束键盘输入(End Of File,EOF) 帮助 1. –help 指令的基本用法与选项介绍。
2. man man 是 manual 的缩写,将指令的具体信息显示出来。
当执行 man date 时,有 DATE(1) 出现,其中的数字代表指令的类型,常用的数字及其类型如下:
代号 类型 1 用户在 shell 环境中可以操作的指令或者可执行文件 5 配置文件 8 系统管理员可以使用的管理指令 3. info info 与 man 类似,但是 info 将文档分成一个个页面,每个页面可以跳转。
4. doc /usr/share/doc 存放着软件的一整套说明文件。
关机 1.