动态规划
Peanut_X
这个作者很懒,什么都没留下…
展开
-
动态规划:打劫房间
给定一个数组,表示一条街上每个房间的金钱数。盗贼抢劫这条街时,如果抢劫了相邻的两个房间,则会触发报警。问盗贼最多能抢到多少钱。 分析:对于每一个房间,有两个选择:抢劫或者不抢劫。如果不抢,前一个房间可以抢也可以不抢,取两者的最大值就是当前的最大值;如果抢,那么前一个房间则不可以抢,得到的钱数是不抢前一个房间得到的钱数加上抢劫当前房间得到的钱数。用一个二维数组记录访问每一个房间时可以得...原创 2018-04-01 21:30:14 · 664 阅读 · 0 评论 -
动态规划:回文子串的长度
给定一个字符串,求其最长的回文子串的长度。如字符串"abcdcba"的最长回文子串长度为7,而"aebfcgdhcibja"的最长回文也是"abcdcba",长度也是7. 分析:典型的动态规划问题,用dp[i][j]记录字符串中从字符 i 到字符 j 中最长回文子串的长度,则 if (s.charAt(i) == s.charAt(j)) { ...原创 2018-04-25 20:32:51 · 149 阅读 · 0 评论 -
动态规划:目标和
问题一:给定一个正整数组nums和一个常数S,要求从nums中取出若干各数,使它们的和为S,问有几种取法。 分析:按照0-1背包问题的方法 public int getSum(int[] nums, int S) { int[][] dp = new int[nums.length + 1][S + 1]; for(int i = 0; i <= nums.length...原创 2018-04-24 21:56:18 · 1116 阅读 · 0 评论 -
动态规划:游戏赢家(一)
给定一个非负数组,A、B两人玩游戏,轮流从数组的头部或者尾部取出元素,加到各自的和中,直到数组元素取完,取到的元素和最大的玩家赢。问对于给定的数组,先开始的玩家能否保证赢得游戏(如果相等也算先手的玩家赢)。 例如给定数组为[1, 5, 233, 7],A为开始第一步的玩家。A可以取1或者7,如果A先取1,剩下[5, 233, 7];B可以取5或者7,但不管B取任何元素,A都可以取23...原创 2018-04-19 21:08:27 · 714 阅读 · 0 评论 -
动态规划:等差子数组
给定一个整数数组,计算其等差子数组的个数(至少有算个元素)。如对于数组[1, 2, 3, 4],其等差子数组有[1, 2, 3], [2, 3, 4] 和 [1, 2, 3, 4]。 分析:只需遍历一次,把等差数列的长度分别计算出来。如果长度为3,其中包含的子数组个数为1,长度为4,包含 2 + 1 个,长度为5,包含 3 + 2 + 1 个,依此类推。 public int nu...原创 2018-04-18 23:15:55 · 962 阅读 · 0 评论 -
动态规划:子数组的和
给定一个正整数数组,问能否把其分成两个子数组,使这两个子数组的和相等。 分析:先把数组和sum求出来,题目实际上是求是否存在子数组,使该子数组的和等于sum的一半。 方法一:用sum的一半,不断减去数组中元素,把所有可能的差值算出来,看是否有等于0。该方法时间复杂度和空间复杂度较高。 方法二:递增法,分别算出子数组长度分别为1,2 ... n 时,看子数组的和是否有等于s...原创 2018-04-18 21:41:13 · 920 阅读 · 0 评论 -
动态规划:0-1 背包问题
0-1背包问题是典型的动态规划问题,需要求解的是,为了体积V的背包中物体总价值最大化,N件物品中第i件应该放入背包中吗?(其中每个物品最多只能放一件)。 思路:定义一个二维数组f[N][V],其中每个元素代表一个状态,即前i个物体中若干个放入体积为V背包中最大价值。其中f[i][j]表示前i件中若干个物品放入体积为j的背包中的最大价值。 分别对i和j进行循环,从小到大逐步计算,其中,...原创 2018-04-22 23:43:17 · 676 阅读 · 0 评论 -
动态规划:硬币个数
给定一个代表硬币不同面值的数组,和一个硬币的总数额,求用硬币凑出该总数额的最小硬币个数。如果无法凑出该面额,返回-1。 如coins = [1, 2, 5],amount = 11。 方法一:用总额减去每一个面值,记录剩余总额,并循环进行,直到出现总额为0或者所有剩余总额都为负数。这种方法简单暴力,时间复杂度和空间复杂度都比较高。 public int coinChang...原创 2018-04-12 21:25:04 · 1303 阅读 · 0 评论 -
动态规划:股票最大收益
给定一个数组,第i个元素代表第i天的股票价格,股票买卖规则如下:必须先买入才能卖出,可以多次买卖,同一天只能进行一次交易,卖出股票后必须暂停交易一天。求可以得到的最大收益。 分析:数组问题是典型的动态规划问题,动态规划问题的思路就是:用变量保存状态,并根据当前状态推测下一步状态。 股票有三种交易状态:buy、sell、rest(不交易),因此,股票操作就是这三种状态的组合 ...原创 2018-04-11 22:41:48 · 1724 阅读 · 0 评论 -
动态规划:摇摆子数组
给定一个数组,求其最长摇摆子数组的长度。 摇摆数组:数组的元素关系按照递增、递减、递增、递减...规律变化的数组,如[1,3,2,5,4]。 数组的摇摆子数组:删除某些元素后,剩下的元素按照原来的顺序组成摇摆数组。如数组[1,17,5,10,13,15,10,5,16,8],删除部分元素后得到的其中一个最长摇摆子数组为[1,17,10,13,10,16,8],其长度为7。 ...原创 2018-04-16 23:15:27 · 1457 阅读 · 0 评论 -
动态规划:最大乘积子串
给定一个数组,求其中乘积最大的子串的乘积。如数组[2,3,-2,4],最大乘积为2*3=6. 分析:最简单的方法是设置一个二维数组p[i][j]表示从 i 到 j 这个子串的乘积,然后求p中的最大值。但这种方法时间复杂度和空间复杂度都比较高。 计算子串的乘积,如果中间包含了0,那么整个子串的乘积就是0。因此,需要以0为分界点,把数组分成几个子串,再分别求最大乘积。计算子串的最大...原创 2018-04-03 23:16:09 · 464 阅读 · 0 评论 -
动态规划:最长递增子串
给定一个数组nums,求其最长的递增子串长度。如数组[10, 9, 2, 5, 3, 7, 101, 18],其最长递增子串为[2, 3, 7, 101],长度为4. 方法一:直接遍历,复杂度为O(n^2)。 方法二:把长度为i + 1的递增子串的最后元素的最小值记录在数组tails中,如对于数组 [4,5,6,3],tails中的记录为: len = 1 : ...原创 2018-04-10 23:04:27 · 2318 阅读 · 2 评论 -
动态规划:平方数个数
给定一个正整数n,计算和等于n的最小平方数个数。平方数:1,4,9,16,25...。例如n=12=4+4+4,因此最小平方数个数为3;n=13=4+9,因此最小平方数为2. 分析:从1开始,用一个数组来记录所有比i小的数的最小平方数个数,当计算i的最小平方数个数时,i可以看成是j^2和i-j^2的和,那么i的最小平方数个数就是i-j^2的最小平方数加1. 即有如下规律:dp[...原创 2018-04-10 20:39:18 · 875 阅读 · 0 评论 -
动态规划:游戏路径
给定一个方格,机器人每步可以向右或向下移动一格,其中方格中的可能会有障碍物,用矩阵中相应位置的1表示。如下面的矩阵表示一个3*3的方格,其中1的表示该位置有障碍物。有障碍物的方格机器人不能通过。求机器人从左上角走到右下角可能有多少条路径。 分析:机器人走到每个方格是方式有两种:从左边过来,或者从上面过来,因此走到每个方格的路径数是走到左边方格的路径数加上走到上面方格的路径数。...原创 2018-04-02 21:33:46 · 520 阅读 · 0 评论 -
动态规划:最小代价阶梯
给定一个数组,代表攀登每级阶梯的代价,每次攀登时,可以爬一级,也可以爬两级(越过一级)。求爬到最顶部时的最小代价。 分析:对每一级阶梯,有两种选择:爬或不爬。如果不爬,那么前一级阶梯必须要爬,越过这级阶梯的代价就是爬前一级阶梯的代价;如果爬,那么前一级阶梯可以爬也可以不爬,代价为爬和不爬前面一级阶梯代价的最小值加上当前阶梯的代价。 public int minCostClimb...原创 2018-04-02 20:58:16 · 432 阅读 · 0 评论 -
动态规划:不含相同数字的数字个数
给定一个常数n,求满足0<=x<10^n,且不包含相同数字的x的个数。例如给定n = 2,则 0<=x<100,且x不能为以下数字:11,22,33... 99,因此x的个数为91。 分析:当n=0时,只有一个值0 当n=1时,除0外,x可以是1,2..9中的任意一个,个数为9。 当n=2时,除了一位的数字,两位...原创 2018-04-14 22:22:12 · 571 阅读 · 0 评论 -
动态规划:解码方式
给定一个数字字符串,其中的数字是按以下编码方式的结果。求对给字符串进行解码时,有多少种解码方式。如对于编码“12”,可以解码成“AB”(“1”,“2”)或“L”(“12”)。 分析:把解码的结果分为两部分:最后一个数为个位数和最后一个数为十位数。如果以个位数结尾,解码下一个数字的时候,有可能可以有两种方式:下一个数字单独作为一个值,或者与前面的数字合并组成一个十位数(前提是 10&l...原创 2018-04-14 20:44:11 · 480 阅读 · 0 评论 -
动态规划:面积最大正方形
给定一个矩阵,其中的元素为0或者1,要求找出其中元素全为1的面积最大的正方形。如下图的矩阵,其元素全为1的最大正方形面积为4。 方法一:对于每一个元素,把以其为右下角的矩阵的和求出来,然后根据这个和与左上边的元素的和的关系来求解。但这种方法时间和空间复杂度都较高。 public int maximalSquare(char[][] matrix) { if(ma...原创 2018-04-14 12:32:11 · 3587 阅读 · 2 评论 -
动态规划:连续子串和
给定一个非负整数数组array和一个整数k,验证array中是否有长度大于1的子串,使该子串的和等于k的整数倍。如数组array = [23, 2, 4, 6, 7],k = 6,因为2 + 4 = 6,所以返回true。 方法一:按照典型的动态规划方法,对数组进行两层遍历。该方法时间复杂度为O(n^2)。 public boolean checkSubarraySum(int[...原创 2018-04-26 20:58:32 · 912 阅读 · 0 评论