动态规划
SIAT_啊哦
啊哦
展开
-
动态规划:回文串系列
1、最长回文子串寻找回文串的问题核心思想是:从中间开始向两边扩散来判断回文串for 0 <= i < len(s): 找到以 s[i] 为中心的回文串;(奇数) 找到以 s[i] 和 s[i+1] 为中心的回文串 (偶数) 更新答案class Solution { public String longestPalindrome(String s) { String result=""; for(int i=0;i<原创 2021-03-08 11:04:44 · 370 阅读 · 0 评论 -
动态规划:KMP字符串匹配
public class KMP{ private int[][] dp; private String pat; public KMP(String pat){ this.pat = pat; int M = pat.length(); dp = new int[M][256]; // dp[状态][遇到的字符] = 下个状态 dp[0][pat.charAt(0)] = 1; //.原创 2021-03-07 16:05:52 · 285 阅读 · 0 评论 -
动态规划:打家劫舍系列问题
1、数组类型你面前房子的索引就是状态,抢和不抢就是选择。public int rob(int[] nums) { int n = nums.length; int[] dp = new int[n+2]; //dp[i]表示从i到最后一个房子最多能盗取的金额 for(int i=n-1;i>=0;i--){ dp[i] = Math.max(dp[i+1], nums[i]+dp[i+2]); }原创 2021-03-05 11:42:48 · 224 阅读 · 1 评论 -
动态规划:四键键盘
对于「按 A 键」这种情况,就是状态 i - 1 的屏幕上新增了一个 A 而已,很容易得到结果:dp[i] = dp[i - 1] + 1; // 按 A 键,就比上次多一个 A 而已但是,如果要按 C-V,还要考虑之前是在哪里 C-A C-C 的。刚才说了,最优的操作序列一定是 C-A C-C 接着若干 C-V,所以我们用一个变量 j 作为若干 C-V的起点(应该看作C-C的位置)。那么 j - 1 、j 操作就应该是 C-A C-C 了:public int maxA(int N) {...原创 2021-03-03 14:33:07 · 304 阅读 · 0 评论 -
动态规划:博弈问题之石子游戏
方法一:数学法先手可以控制自己拿所有下标为奇数的石堆或者拿所有下标为偶数的石堆,只要先计算一下奇数石堆的石子总数和偶数石堆的石子总数哪种多就选哪种,所以先手总会赢return true;方法二:动态规划假设先手和后手都最聪明的情况下,返回先手和后手拿到的石头个数之差dp数组定义:dp[i][j][0]从下标i到j堆石头,先手能获得的最大数量;dp[i][j][1]表示后手public boolean stoneGame(int[] piles) { int n = pi.原创 2021-03-02 11:10:18 · 342 阅读 · 0 评论 -
动态规划:戳气球
1、题目说可以认为nums[-1] = nums[n] = 1,那么我们先直接把这两个边界加进去,形成一个新的数组points2、dp[i][j] = x表示,戳破气球i和气球j之间(开区间,不包括i和j)的所有气球,可以获得的最高分数为x。3、我们需要「反向思考」,想一想气球i和气球j之间最后一个被戳破的气球可能是哪一个?4、其实气球i和气球j之间的所有气球都可能是最后被戳破的那一个,不防假设为k。回顾动态规划的套路,这里其实已经找到了「状态」和「选择」:i和j就是两个「状态」,最后戳破的那个气..原创 2021-02-26 11:08:38 · 236 阅读 · 0 评论 -
动态规划:高楼扔鸡蛋
方法一:常规动态规划1、dp[i][j]数组定义:dp[i][j]表示鸡蛋数量为i,可选楼层数为j的状态下确定F的最少步数,问题所求为dp[K][N]2、base case:当楼层数为0,步数为0;当楼层数为1,步数为1;当鸡蛋数为0,步数为0;当鸡蛋数为1,步数为楼层数3、求状态(i,j)的情况下最少的步数,可选楼层数为j,则遍历1到j的所有楼层,开始扔鸡蛋4、当前在h楼扔鸡蛋,步数首先加1,然后分别求鸡蛋破或者没破的最大步数值,作为当前楼扔的值,再求所有楼层扔的最小值5、时间复杂度O(KN.原创 2021-02-24 15:32:03 · 408 阅读 · 0 评论 -
动态规划:正则表达式匹配
public boolean isMatch(String s, String p) { int m = s.length(); int n = p.length(); boolean[][] dp = new boolean[m + 1][n + 1]; dp[0][0] = true; for(int i = 0; i <= m; i++){ for(int j = 1; j <= n..原创 2021-02-23 14:07:24 · 151 阅读 · 0 评论 -
动态规划:背包问题
0-1背包问题 和 完全背包问题 的区别在于:前者每个物品的个数是有限的;后者每个物品的个数是无限的。也就是为什么当选择将当前物品放进背包时,完全背包是dp[i][…]而不是dp[i-1][…]动态规划框架:0-1背包模板:完全背包模板:for(int i=1;i<=n;i++){ for(int j=1;j<=amount;j++){ if(j<coins[i-1]){ d原创 2021-02-22 09:57:29 · 104 阅读 · 0 评论 -
动态规划——最小编辑距离
解决两个字符串的动态规划问题,一般都是用两个指针i,j分别指向两个字符串的最后,然后一步步往前走,缩小问题的规模。base case 是i走完s1或j走完s2,可以直接返回另一个字符串剩下的长度。对于每对字符s1[i]和s2[j],可以有四种操作:这个「三选一」到底该怎么选择呢?很简单,全试一遍,哪个操作最后得到的编辑距离最小,就选谁。这里需要递归技巧,理解需要点技巧,先看下代码:递归版本def dp(i, j) -> int返回 s1[0..i] 和 s2[0..j] 的最小编...原创 2021-02-04 21:30:50 · 648 阅读 · 0 评论