![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
动态规划
背包问题
线性DP
区间DP
计数类DP
数位统计DP
状态压缩DP
树形DP
记忆化搜索
SoKeeGumpCN
瞎混
展开
-
AcWing 1226. 包子凑数(DP)
第八届蓝桥杯省赛C++A/B组完全背包类似的问题,f表示状态,f[j]表示数字j能否被凑出来,做法是减去现有的笼子数,往下递减看更小的数能否被凑出来。import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;class Main { static Buffe...原创 2020-04-10 10:37:31 · 147 阅读 · 0 评论 -
AcWing 1222. 密码脱落(区间DP)
Problem区间dp问题,也最长公共子串差不多的模式,还不是很熟,这个题的f[l][r]代表区间l到r内最大的回文串。import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;class Main { static BufferedReader br = ...原创 2020-04-09 10:09:55 · 133 阅读 · 0 评论 -
AcWing 1047. 糖果 (dp)
ProblemDP问题,背包问题,f[i][j] 表示只考虑前i个物品,除以k余数为j的情况所能拿到的最大价值。每一步考虑拿或者不拿第i件物品,不拿f[i - 1][j]如果拿的话,首先去掉第i件物品,求余k,再加上i的价值。import java.io.BufferedReader;import java.io.IOException;import java.io.InputStre...原创 2020-04-06 22:01:33 · 132 阅读 · 0 评论 -
AcWing 1050. 鸣人的影分身(DP)
ProblemDP问题,好久不做dp问题还有点陌生,这个问题是m拆分成n个数相加,有多少个,考虑n中最小值如果是0,那么答案不变,如果不是0,从1开始一个一个分。import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Arrays;...原创 2020-04-04 21:45:17 · 181 阅读 · 0 评论 -
AcWing 1214. 波动数列 (动态规划)
第五届蓝桥杯题Problem同样限制比较多的一道题目,事先需要先分析一下两种操作+a || -b 不妨记为P操作,则设首项为x,可以得到一个等式x+(x+P)+(x+2P)+…+(x+(n−1)P)=sx+(x+P)+(x+2P)+…+(x+(n−1)P)=s,将这个式子整理一下,就是nx+P+2P+…+(n−1)P=snx+P+2P+…+(n−1)P=s,即(s−(P+2P+…+(n−1)...原创 2020-02-09 18:05:16 · 157 阅读 · 0 评论 -
AcWing 1212. 地宫取宝 (动态规划)
第五届蓝桥杯省赛第九题,地宫取宝问题,难度还真不小。Problem这个题的限制要求比较多,dp自然比较繁琐,这里采用四个状态f(i, j, k, c)表示在(i, j)这个点上拿了k个物品,物品最大价值为c由于数据范围很小,五重循环是可以接受的。//// Source code recreated from a .class file by IntelliJ IDEA// (powe...原创 2020-02-09 13:18:51 · 239 阅读 · 0 评论 -
AcWintg 1015. 摘花生 (动态规划)
Problem这个题和数字金字塔三角形就有点像,重要的是确定最后一步的状态,也是典型的线性dp问题,也就是根据下标增进来递推的问题。因为只能往右和下走,最后一步只能从左边或者上面走过来,于是有递推式。import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;pub...原创 2020-02-07 13:41:08 · 272 阅读 · 0 评论 -
AcWing 338. 计数问题(数位dp)
这个题的意思是分别求 0 - 9 在 1 - n中出现的个数,是个数位动态规划的内容,难度还是比较大的。题目特殊情况:x在第1位上出现的次数(不用考虑前半段):bcdefg∈[00000,bcdefg] , ans += bcdefg+1x在最后一位上出现的次数(不用考虑后半段):如果g<x,那么不存在这样的数,ans += 0如果g==x,那么有一个这样的数,ans +=...原创 2019-12-29 05:06:09 · 343 阅读 · 0 评论 -
AcWing 900. 整数划分(完全背包)
题目先看题目,类比完全背包问题把1,2,3, … n分别看做n个物体的体积,这n个物体均无使用次数限制,问恰好能装满总体积为n的背包的总方案数import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;clas...原创 2019-12-27 17:55:45 · 194 阅读 · 0 评论 -
AcWing 282. 石子合并(动态规划)
典型的分组dp问题,f[i][j]表示区间i到j的状态,然后在看题目。题目import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;class Main { static BufferedReader...原创 2019-12-27 03:08:14 · 154 阅读 · 0 评论 -
AcWing 899. 编辑距离(动态规划)
这个题是最短编辑距离的一个小应用,直接套进去就可以了。题目需要注意的是原本每次计算时都重新new了一个f[][] 发现爆内存,是因为每次虚拟机都会创建新的一个二维数组,但是f仅仅指向一个地址。import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import j...原创 2019-12-25 23:10:01 · 222 阅读 · 0 评论 -
AcWing 902. 最短编辑距离(动态规划)
这个题也做到过,貌似是鹅厂的压轴题,用三种方式编辑两个字符串的相似距离。题目集合:将a[1~ j]变成b[1~ j]的操作方式属性:min考虑过程比较难,从末尾开始考虑,三种操作方式上着手。以下来自AcWing网友整理,很细致有三种操作,所以有三个子集ok子集划分完了考虑状态转移的时候先考虑如果我没有进行这个操作应该是什么状态然后考虑你进行这一步操作之后会对你下一个状态造成什么...原创 2019-12-24 05:46:29 · 2334 阅读 · 0 评论 -
AcWing 897. 最长公共子序列(动态规划)
动态规划经典问题。题目f[i][j] 表示第一个序列的前i个字母,第二个序列的前j个字母构成的公共子序列。import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;class Main { stat...原创 2019-12-24 00:06:34 · 298 阅读 · 0 评论 -
AcWing 895. 最长上升子序列(动态规划)
这题是dp经典问题 最长上升子序列在10-08写过本题的题解,但是有点遗忘,再补一次,并且基础打卡是按照章节来的,也方便今后查找。这是10-08的题解:最长上升子序列主要是两次遍历,f[i] = Math.max(f[i], f[j] + 1);import java.io.BufferedReader;import java.io.InputStreamReader;import j...原创 2019-12-22 04:16:12 · 196 阅读 · 0 评论 -
AcWing 9. 分组背包问题(背包)
分组背包,每组只能拿一个。题目大同小异,在每个组中判断,f[i][j]表示前i组,总体积不大于j的最大数。import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;class Main { stati...原创 2019-12-22 03:50:19 · 138 阅读 · 0 评论 -
AcWing 5. 多重背包问题 II (多重背包)
这道题相比上个多重背包,数据范围扩大,直接遍历各个物品的数量会TLE,这个地方用到一个巧妙地优化方法:二进制。例如1,2,4,8,16,…16以内的正整数能用20 21 22 23 凑出来,所以把物品打包来处理,不会遗漏任何数字。题目import java.io.BufferedReader;import java.io.IOException;import java.io.Input...原创 2019-12-21 02:01:56 · 207 阅读 · 0 评论 -
AcWing 4. 多重背包问题(背包)
在完全背包的基础上加了数量限制,思路也很简单,在完全背包基础上循环一边限制量就可解决。题目import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;class Main { static Buffere...原创 2019-12-20 21:28:57 · 153 阅读 · 0 评论 -
AcWing 898. 数字三角形 (动态规划)
经典问题,数字金字塔。题目倒着求一编**import java.io.*;class Main{ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static PrintWriter pw = new PrintWriter(System.out); ...原创 2019-12-20 19:38:33 · 139 阅读 · 0 评论 -
AcWing 3. 完全背包(动态规划-完全背包)
完全背包只需要在01基础上把体积改成顺着过一遍,就可以了。题目import java.io.*;class Main{ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static PrintWriter pw = new PrintWriter(System.o...原创 2019-12-20 18:15:31 · 112 阅读 · 0 评论 -
AcWing 2. 01背包问题 (动态规划-01背包)
从这节开始又回答了令人头疼的动态规划,不过基本都是基础问题,不会像暑期打卡的某些题目一样难的没谱。题目背包问题的证明网上太多太多了,这里就不给出了,上传图片是在太麻烦。import java.io.*;class Main{ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in))...原创 2019-12-20 18:06:09 · 166 阅读 · 0 评论 -
LeetCode 664. 奇怪的打印机(动态规划) Java
难度螺旋式上升LeetCode暑期打卡第八周题九,区间动态规划问题,也有可能是为数不多接触区间DP问题,感觉入手很难理解,特别很难想到状态转移的含义,看了别人的思路自己理了一下。题目:有台奇怪的打印机有以下两个特殊要求:打印机每次只能打印同一个字符序列。每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符。给定一个只包含小写英文字母的字符串,你的任务是计算这个打印机打印它...原创 2019-10-11 04:25:34 · 356 阅读 · 0 评论 -
LeetCode 518. 零钱兑换 II(动态规划) Java
LeetCode 暑期打卡第八周题八,经典的类完全背包问题题目:给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。示例 1:输入: amount = 5, coins = [1, 2, 5]输出: 4解释: 有四种方式可以凑成总金额:5=55=2+2+15=2+1+1+15=1+1+1+1+1示例 2:输入: amoun...原创 2019-10-10 18:49:28 · 237 阅读 · 0 评论 -
LeetCode 72. 编辑距离(动态规划) Java
LeetCode 暑期打卡第八周题七(难度跨度有点大)题目描述:给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入: word1 = “horse”, word2 = “ros”输出: 3解释:horse -> rorse (将 ‘...原创 2019-10-09 04:27:59 · 205 阅读 · 0 评论 -
LeetCode 300. 最长上升子序列 (动态规划) Java
LeetCode 暑期打卡第八周题六经典题目: 最长上升子序列给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-increasi...原创 2019-10-08 21:21:19 · 188 阅读 · 0 评论 -
LeetCode 198.打家劫舍(动态规划) Java
LeetCode 暑期打卡第八周题五题目:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1...原创 2019-10-07 20:49:04 · 158 阅读 · 0 评论 -
LeetCode 91. 解码方法(动态规划) Java
LeetCode 暑期打卡第八周题四题目:一条包含字母 A-Z 的消息通过以下方式进行了编码:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:输入: “12”输出: 2解释: 它可以解码为 “AB”(1 2)或者 “L”(12)。示例 2:输入: “226”输出: 3解释: 它可以解...原创 2019-10-07 18:44:18 · 230 阅读 · 0 评论 -
LeetCode63. 不同路径 II (动态规划) Java
LeetCode 暑期打卡第八周题三题目:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?图片来源于LeetCode。大致思路:每到一个点只能由左边或者上面过来,那么就形成两种状...原创 2019-10-07 16:26:38 · 192 阅读 · 0 评论 -
LeetCode 120. 三角形最小路径和
LeetCode 暑期打卡第八周题二题目:给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[[2],[3,4],[6,5,7],[4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。说明:如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分...原创 2019-10-07 15:38:57 · 119 阅读 · 0 评论 -
LeetCode 53. 最大子序和(动态规划) Java
今天开始学习LeetCode暑期打卡第八周的题目,主题是动态规划,也是所有章节中最难的一节,做好心理准备就开始吧!yxc的推荐思路:DP问题可以从集合的角度来考虑会比较好理解。第一题比较简单,是一个很经典的dp问题,求最大子序和,一起来看题目。题目:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,...原创 2019-10-07 05:52:29 · 232 阅读 · 0 评论