![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
dp
溺水的鱼xu
这个作者很懒,什么都没留下…
展开
-
将数组分成两部分,使得这两部分的和的差最小
将数组分成两部分,使得这两部分的和的差最小将一个数组分成两部分,不要求两部分所包含的元素个数相等,要求使得这两个部分的和的差值最小。比如对于数组{1,0,1,7,2,4},可以分成{1,0,1,2,4}和{7},使得这两部分的差值最小。这个问题可以转化为求数组的一个子集,使得这个子集中的元素的和尽可能接近sum/2,其中sum为数组中所有元素的和。这样转换之后这个问题就很类似0-1背包问题了:在n件物品中找到m件物品,他们的可以装入背包中,且总价值最大不过这里不考虑价值,就考虑使得这些元素的和尽量接近s原创 2021-07-28 22:17:40 · 2345 阅读 · 1 评论 -
NC126 换钱的最少货币数
NC126 换钱的最少货币数这题类似于背包问题class Solution {public: int minMoney(vector<int>& arr, int aim) { // write code here int dp[arr.size()+10][aim+10]; arr.insert(arr.begin(), 0); // for (int i = 1; i原创 2021-07-28 20:34:44 · 86 阅读 · 0 评论 -
鸡蛋落地问题
1884. 鸡蛋掉落-两枚鸡蛋class Solution {public: int twoEggDrop(int n) { int i, j; int f; int dp[n + 1][3]; memset(dp, 0x3f3f3f, sizeof(dp)); for (i = 1; i <= n; i++) { dp[i][1] = i; }原创 2021-07-28 20:27:35 · 101 阅读 · 0 评论 -
NC91 最长递增子序列
NC91 最长递增子序列这道题n的范围是1e5,因此不能使用常规的dp[i],表示以i结尾的最大的子序列,因为这个时间复杂度是n方级别。因此要换一种算法。贪心+二分,时间复杂度为O(nlogn)下面说说贪心+二分的解法,举例说明基本思路,假设数组arr为[2, 3, 1, 2, 3],vec数组里面存放递增子序列,maxLen数组里存放以元素i结尾的最大递增子序列长度,那么遍历数组arr并执行如下更新规则:初始情况下,vec为[2],maxLen[1]接下来遇到3,由于vec最后一个元素小于3,直原创 2021-07-20 22:07:04 · 1033 阅读 · 1 评论 -
最长公共子串或子序列
要区分子串和子序列的区别NC127 最长公共子串dp[i] [j]表示两个串分别以i和j结尾的最长公共子串。这个求子串可以直接截取。class Solution {public: string LCS(string str1, string str2) { // write code here //if(str1==""||str2=="" ) return ""; str1=" "+str1;原创 2021-07-20 22:19:16 · 64 阅读 · 0 评论 -
NC108 最大正方形
NC108 最大正方形你可以观察发现,如果以(i,j)为右下角的出现了正方形,那么他的(i-1,j),(i,j-1), (i-1,j-1)这几个也是正方形,我们只需要取他们最小的就行了。dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1;class Solution {public: int solve(vector<vector<char> >& matrix) { // write c原创 2021-07-21 17:15:33 · 98 阅读 · 0 评论 -
买卖股票总结
买卖股票的最佳时机 II买卖股票的最佳时机 III思路与算法由于我们最多可以完成两笔交易,因此在任意一天结束之后,我们会处于以下五个状态中的一种:未进行过任何操作;只进行过一次买操作;进行了一次买操作和一次卖操作,即完成了一笔交易;在完成了一笔交易的前提下,进行了第二次买操作;完成了全部两笔交易。class Solution {public: int maxProfit(vector<int>& prices) { vector<原创 2021-07-21 20:20:57 · 175 阅读 · 1 评论 -
NC83 子数组最大乘积
NC83 子数组最大乘积本题要求最大子序积,是【最大子序和】的加强版,动态规划是最优解法。在最大子序和中,状态转移方程为:f(i)=max{f(i−1)+arr[i], arr[i]}f(i)是数组的局部最大子序和,求出最大的f(i)即可。最大子序积中,需要考虑负数的问题,因为一个负数乘以一个负数可能会变为最大值。于是我们维护局部最大值fmax(i)和局部最小值fmin(i),状态转移方程如下:fmax(i) = max{fmax(i-1)*arr[i], fmin(i-1)*arr[i], a原创 2021-07-22 13:54:25 · 163 阅读 · 0 评论 -
LeetCode 1884. 鸡蛋掉落-两枚鸡蛋
LeetCode 1884. 鸡蛋掉落-两枚鸡蛋class Solution {public: int twoEggDrop(int n) { int i, j; int f; int dp[n + 1][3]; memset(dp, 0x3f3f3f, sizeof(dp)); for (i = 1; i <= n; i++) { dp[i][1] = i;原创 2021-07-23 15:36:43 · 162 阅读 · 0 评论 -
LeetCode 完全平方数
LeetCode 完全平方数class Solution {public: int numSquares(int n) { int dp[n+10]; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { int Min=INT32_MAX; for(int j=1;j*j<=i;j++) {原创 2021-07-25 15:15:03 · 82 阅读 · 0 评论 -
NC126 换钱的最少货币数
NC126 换钱的最少货币数原创 2021-07-26 19:09:53 · 60 阅读 · 0 评论 -
NC95 数组中的最长连续子序列
NC95 数组中的最长连续子序列动态规划class Solution {public: /** * max increasing subsequence * @param arr int整型vector the array * @return int整型 */ vector<int> a; map<int,int> mp; int dp[100005]; int MLS(vector&l原创 2021-07-27 23:37:21 · 105 阅读 · 0 评论 -
背包问题克星——分组背包
背包问题克星——分组背包有N件物品,告诉你这N件物品的重量以及价值,将这些物品划分为K组,每组中的物品互相冲突,最多选一件,求解将哪些物品装入背包可使这些物品的费用综合不超过背包的容量,且价值总和最大。算法:首先判断一个分组当中的一件物品,同01背包一样,此物品存在两种状态,取与不取,若取此物品,则继续判断下一组的第一件物品,若不取此物品,则继续判断本组下一件物品,若该物品为本组最后一件物品...原创 2020-01-16 09:27:07 · 549 阅读 · 0 评论 -
混合背包详解
混合背包有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。应该怎么求解呢?01背包与完全背包的混合考虑到在P01和P02中给出的伪代码只有一处不同,故如果只有两类物品:一类物品只能取一次,另一类物品可以取无限次,那么只需在对每个物品应用转移方程时,根据物品的类别选用顺序或逆序的循环即可,复杂度是O(VN)。伪代码如下:for i...原创 2020-01-15 22:43:01 · 318 阅读 · 0 评论 -
二维费用背包,二维背包
①基本题型:二维费用的背包问题是指对于每件物品,具有两种不同的费用,选择这件物品必须同时付出这两种代价,对于每种代价都有一个可付出的最大值(背包容量),求选择物品可以得到最大的价值。设第i件物品所需的两种代价分别为v[i]和u[i],两种代价可付出的最大值(两种背包容量)分别为V和U,物品的价值为w[i]。②基本解法:相比经典的01背包问题,二维费用背包问题增加了一维费用,于是我们需要在状态...原创 2020-01-15 22:32:47 · 251 阅读 · 0 评论 -
背包问题的克星——背包九讲
P01: 01背包问题题目有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][...原创 2020-01-15 16:45:19 · 241 阅读 · 0 评论 -
多重背板问题
#include<bits\stdc++.h>using namespace std;typedef long long ll;const int maxn=1e3;int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,v; cin>>n>>v; in...原创 2020-01-15 16:38:02 · 138 阅读 · 0 评论 -
完全背包问题
完全背包模板#include<bits\stdc++.h>using namespace std;typedef long long ll;const int maxn=1e3;int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,v; cin>>n>>...原创 2020-01-15 16:36:20 · 103 阅读 · 0 评论 -
01背包问题
01背包模板#include<bits\stdc++.h>using namespace std;typedef long long ll;const int maxn=1e3;int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,v; cin>>n>>...原创 2020-01-15 16:34:48 · 134 阅读 · 0 评论 -
状压dp
题目大意:农夫有一块地,被划分为m行n列大小相等的格子,其中一些格子是可以放牧的(用1标记),农夫可以在这些格子里放牛,其他格子则不能放牛(用0标记),并且要求不可以使相邻格子都有牛。现在输入数据给出这块地的大小及可否放牧的情况,求该农夫有多少种放牧方案可以选择(注意:任何格子都不放也是一种选择,不要忘记考虑!#include <cstdio>#include <cstrin...原创 2019-08-23 17:56:49 · 139 阅读 · 1 评论