摘要: 最后更新 一刷。 用数学方法是看是不是3的倍数。 不用数学方法的话要动态规划。 当前玩家,dp[i]行不行取决于dp[i 1]和dp[i 2],代表下一个玩家能不能赢,另一个玩家能赢的话当前就不能赢;另一个玩家不能赢,当前就能赢。 因为当前玩家可以通过拿1个或者拿2个来左右结果。 dp[i] = ! 阅读全文
posted @ 2016-12-21 05:46 哇呀呀..生气啦~ 阅读(225) 评论(0) 推荐(0)
摘要: 刷 July 29 2019 以i j为当前位置,它为右下角组成的最大的正方形是,如果上左斜上3个位置都是1,那么它的最大长度取决于刚才3个点里面最小的+它自己的1. 就是这个DP规则,不是很难。 理论上说这种二维的DP,只需要2行或者2列作为DP保存上一轮的值就行,就是滚动。 OLD 用DP. T 阅读全文
posted @ 2016-12-21 04:22 哇呀呀..生气啦~ 阅读(218) 评论(0) 推荐(0)
摘要: 最后更新 二刷? 和小机器人走路径差不多= = 这个可以在原有的盘子上更新= = 如果不是只读。 Time : O(N) + O(M) + O(M N) Space: in place java public class Solution { public int minPathSum(int[][ 阅读全文
posted @ 2016-12-21 03:55 哇呀呀..生气啦~ 阅读(121) 评论(0) 推荐(0)
摘要: 最后更新 四刷? 依然是尝试用一维DP。 每次更新DP的时候相当于直接添加了2个方向的贡献值。 开始的dp[1] = 1不好理解,其实是代表每行第一个格子dp[j]来自左边的贡献值,来自上面的贡献值是他本身,我们在上一行算过,所以是dp[j] + 1。 下个格子dp[j+1]就变成了来自左边的贡献值 阅读全文
posted @ 2016-12-21 02:57 哇呀呀..生气啦~ 阅读(118) 评论(0) 推荐(0)
摘要: 机器人走棋盘,左上到右下。 比较典型的动态规划,某个格的情况无非是从上面或者从左边来,两者相加就行。 Java public class Solution { public int uniquePaths(int m, int n) { int[][] dp = new int[m][n]; dp[ 阅读全文
posted @ 2016-12-21 02:49 哇呀呀..生气啦~ 阅读(164) 评论(0) 推荐(0)