![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP
清汤芥末面
这个作者很懒,什么都没留下…
展开
-
327. 玉米田
添加链接描述状压DP。#include<bits/stdc++.h>#define ll long long#define x first#define y second#define ios ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);using namespace std;const int M=15,INF=0x3f,mod=1e8;ll a[M],dp[M][1<<M];vector<int原创 2022-04-13 17:35:48 · 206 阅读 · 0 评论 -
479. 加分二叉树
添加链接描述区间dp#include<bits/stdc++.h>#define ll long long#define x first#define y second#define ios ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);using namespace std;const int M=35,INF=0x3f;int a[M],dp[M][M],g[M][M];void dfs(int l,int r)原创 2022-04-13 11:14:04 · 734 阅读 · 0 评论 -
320. 能量项链
添加链接描述#include<bits/stdc++.h>#define ll long long#define x first#define y second#define ios ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);using namespace std;const int M=200,INF=0x3f;int a[M],dp[M][M];int main(){ int n; cin>原创 2022-04-09 20:57:37 · 316 阅读 · 0 评论 -
323. 战略游戏
树形dp,一般都是从叶子节点开始,所以一般和dfs相结合,这道题很静但,dp[i][1]表示以i为根节点并且选择i时的最少需要的士兵数,dp[i][0]表示以i为根节点并且不选择i时的最少需要的士兵数。递推公式也比较好写, dp[u][0]+=所有子节点dp[v][1]; dp[u][1]+=所有子节点min(dp[v][0],dp[v][1]);添加链接描述#include<bits/stdc++.h>#define ll long long#define x first#defi原创 2022-04-06 20:24:18 · 3687 阅读 · 0 评论 -
91. 最短Hamilton路径
状压DP添加链接描述#include<bits/stdc++.h>#define ll long long#define ios ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);using namespace std;const int M=21,N=1<<M,INF=0x3f;int a[M][M],dp[N][M];int main(){ int n; cin>>n;原创 2022-04-01 12:06:43 · 120 阅读 · 0 评论 -
291. 蒙德里安的梦想
添加链接描述状态压缩dp注意不能预处理ST数组,因为n不同,合法状态就不同,比如n等于5时,10000合法,n等于6时010000就不合法,10000和010000是一个数,但是数组里这个位置的值随n的不同而不同。#include<bits/stdc++.h>#define ll long longusing namespace std;const int maxn=3e4+5,INF=0x3f,mod=1e9+7;ll dp[15][maxn];bool st[maxn];原创 2022-03-28 11:36:07 · 625 阅读 · 0 评论 -
01背包、完全背包
01背包#include<bits/stdc++.h>using namespace std;const int N = 1e3+5;int dp[N],v[N],w[N];int main(){ int n,V; cin >> n>>V; for(int i=1;i<=n;i++) cin >> v[i]>>w[i]; for(int i=1;i<=n;i++) fo原创 2022-03-22 21:06:08 · 129 阅读 · 0 评论 -
201403-4 无线网络
BFS+DPBFS求最短路#include<bits/stdc++.h>#define x first#define y second#define ll long longusing namespace std;const int maxn=1e3+5,INF=0x3f;typedef pair<ll,ll>PPI;PPI a[maxn];double compute(PPI s1,PPI s2){ return (s1.x-s2.x)*(s1.x-s原创 2022-03-02 15:34:34 · 50 阅读 · 0 评论 -
213. 打家劫舍 II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。链接刚开始老想第一个房屋和最后一个房屋进行讨论,当时想的第一个房屋如果偷了最后一个房屋一定偷,但是我忽略了第一个房屋和第二个房屋有可能都不偷,这是由递推式决定原创 2022-02-25 10:42:34 · 58 阅读 · 0 评论 -
198. 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。链接dp[i]表示偷前i家最大的最大金额,递推公式为dp[i]=max(dp[i-1],dp[i-2]+nums[i]);class Solution {public: int rob(vector&l原创 2022-02-25 08:30:17 · 51 阅读 · 0 评论 -
139. 单词拆分
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。题解参考链接:https://leetcode-cn.com/problems/word-break/solution/dai-ma-sui-xiang-lu-139-dan-ci-chai-fen-50a1a/dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。确定原创 2022-02-24 20:51:52 · 77 阅读 · 0 评论 -
279. 完全平方数
给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。完全背包求最小值问题,迭代顺序没要求,都行,组合问题物品在前,排列问题背包在前。class Solution {public: int numSquares(int n) { int dp[10000]; memset(dp,0x3f,sizeof原创 2022-02-24 19:47:33 · 68 阅读 · 0 评论 -
322. 零钱兑换
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/coin-change著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。完全背包,dp[i]表示凑成i元最少需要硬币dp[i]个,将dp初始成无穷大,原创 2022-02-24 17:47:27 · 64 阅读 · 0 评论 -
377. 组合总和 Ⅳ
给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/combination-sum-iv著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。在求装满背包有几种方案的时候,认清遍历顺序是非常关键的。如果求组合数就是外层for循环遍历物品,内层for原创 2022-02-24 15:46:37 · 392 阅读 · 0 评论 -
518. 零钱兑换 II
给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。假设每一种面额的硬币有无限个。题目数据保证结果符合 32 位带符号整数。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/coin-change-2著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。完全背包求数量问题。模板class Solutio原创 2022-02-24 14:53:21 · 65 阅读 · 0 评论 -
474. 一和零
给你一个二进制字符串数组 strs 和两个整数 m 和 n 。请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/ones-and-zeroes著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。本题中strs 数组里的元素就是物品,每个物品都是一个!而m 和 n相原创 2022-02-24 14:21:48 · 52 阅读 · 0 评论 -
494. 目标和
给你一个整数数组 nums 和一个整数 target 。向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/target-sum著作权归领扣网原创 2022-02-23 21:30:33 · 69 阅读 · 0 评论 -
1049. 最后一块石头的重量 II
有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0。来源:力扣(LeetCode)链接:h原创 2022-02-23 20:04:15 · 143 阅读 · 0 评论 -
416. 分割等和子集
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。添加链接描述可以用回溯暴力搜索出所有答案的,但最后超时了,也不想再优化了,放弃回溯,直接上01背包吧。背包的体积为sum / 2,背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值,背包如何正好装满,说明找到了总和为 sum / 2 的子集。背包中每一个元素是不可重复放入。刚开始我将元素个数当作重量,数值当作价值,但是发现求价值的最大值并不能解决是否恰好等于sum原创 2022-02-23 15:53:33 · 118 阅读 · 0 评论 -
96. 不同的二叉搜索树
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。链接dp[i]代表i个节点时的种类数,所以每次从1到i进行遍历,以j作为根节点,那么左边有dp[j-1]种组合,右边有dp[i-j]种组合,将其求和即可。class Solution {public: int numTrees(int n) { int dp[20]; memset(dp,0,sizeof(dp));原创 2022-02-22 21:24:11 · 94 阅读 · 0 评论 -
343. 整数拆分
给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。贪心可以做,我们知道分成的数越接近乘起来就越大,数据量不大就循环分成的个数。class Solution {public: int integerBreak(int n) { long long sum=0; for(int i=2;i<=n;i++) { if(n%i==0)原创 2022-02-21 19:43:41 · 411 阅读 · 0 评论 -
63. 不同路径 II
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/unique-paths-ii著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注原创 2022-02-21 17:26:14 · 50 阅读 · 0 评论 -
62. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/unique-paths著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。int dp[102][102];class Solution {public:转载 2022-02-21 16:59:07 · 49 阅读 · 0 评论 -
746. 使用最小花费爬楼梯
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/min-cost-climbing-stairs著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。const int maxn=1e3+5;原创 2022-02-21 16:53:52 · 52 阅读 · 0 评论 -
509. 斐波那契数
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1) = 1F(n) = F(n - 1) + F(n - 2),其中 n > 1给定 n ,请计算 F(n) 。class Solution {public: int fib(int n) { int dp[35]; memset(dp,0,sizeof(dp)); dp[原创 2022-02-21 16:42:49 · 149 阅读 · 0 评论 -
70. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?int dp[50];class Solution {public: int climbStairs(int n) { dp[1]=1; dp[2]=2; for(int i=3;i<=n;i++) dp[i]=dp[i-1]+dp[i-2]; return dp[n]; }原创 2022-02-21 16:41:46 · 141 阅读 · 0 评论 -
45. 跳跃游戏 II
添加链接描述给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。自己写出来的DP,我一看条件,1 <= nums.length <= 1e4,0 <= nums[i] <= 1000。1e7的负责度跑的完,就直接暴力dp了。dp[i]指到下标为i的点的最短距离。const int maxn=1e4+2;int dp[max原创 2022-02-15 21:55:07 · 2725 阅读 · 0 评论