![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP训练题单
幽殇默
他时若遂凌云志,敢笑黄巢不丈夫。
展开
-
0x00 基本算法
目录位运算89. a^b位运算89. a^b题目地址考察的知识点: 快速幂#include<cstdio>#include<iostream>using namespace std;typedef long long LL;LL a,b,p;LL quick_mi(LL a,LL b,LL p){ LL res=1; while(b) { if(b&1) res=res*a%p; a=a*a%p; b>>=1; } r原创 2021-06-09 22:14:43 · 879 阅读 · 0 评论 -
面试题 17.16. 按摩师【一般 / DP】
https://leetcode-cn.com/problems/the-masseuse-lcci/状态表示:f[i][j] 表示前j个数中,最后状态是i的和例如:f[0][i] 表示前i个中,当前i不执行的最大和。f[1][i] 表示前i个中,当前i执行的最大和。class Solution {public: int massage(vector<int>& nums) { int f[3][200001]={0}; .原创 2021-11-08 17:10:08 · 90 阅读 · 0 评论 -
面试题 05.03. 翻转数位【一般DP】
https://leetcode-cn.com/problems/reverse-bits-lcci/状态表示:f[i][j] 当i==1时为全是1的且以j结尾的全是1的字符串的长度 。 当i==0时,表示有0的时候全是1的且以j结尾的全是1的字符串的长度 。状态转移如下:如果s[i]=='1' f[1][i]=f[1][i-1]+1; f[0][i]=f[0][i-1]+1;如果s[i]=='0' f[0][i]=f[1][i-1]+1; f[1][i]=0;class Solution.原创 2021-11-08 16:48:17 · 76 阅读 · 0 评论 -
面试题 08.01. 三步问题【DP水题】
https://leetcode-cn.com/problems/three-steps-problem-lcci/class Solution {public: const int mod=1e9+7; int waysToStep(int n) { long long int f[1000001]={0}; f[0]=1,f[1]=1,f[2]=2; for(int i=3;i<=n;i++) f[i]=(f[i-1].原创 2021-11-08 16:10:26 · 64 阅读 · 0 评论 -
1646. 获取生成数组中的最大值【简单水题DP】
https://leetcode-cn.com/problems/get-maximum-in-generated-array/class Solution {public: int getMaximumGenerated(int n) { int f[105]={0}; f[1]=1; for(int i=2;i<=n;i++) { if(i&1) f[i]=f[i/2]+f[i/.原创 2021-11-07 22:30:13 · 63 阅读 · 0 评论 -
746. 使用最小花费爬楼梯【简单DP】
https://leetcode-cn.com/problems/min-cost-climbing-stairs/状态表示:f[i] 表示到达i层楼梯需要的最少花费状态转移: f[i]=min(f[i-1]+f[i-2])+cost[i]class Solution {public: int minCostClimbingStairs(vector<int>& cost) { cost.push_back(0); int n=.原创 2021-11-06 22:41:07 · 68 阅读 · 0 评论 -
338. 比特位计数【简单 DP】
https://leetcode-cn.com/problems/counting-bits/很容易可以想到一个暴力的做法class Solution {public: vector<int> countBits(int n) { vector<int>ans; for(int i=0;i<=n;i++) { int temp=i,cnt=0; while(.原创 2021-11-06 22:14:56 · 90 阅读 · 0 评论 -
121. 买卖股票【入门题】
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/f[i]表示以i点卖出的收益 对于i我们在[1,i-1]找到一个最小的值class Solution {public: int maxProfit(vector<int>& prices) { int f[100010]={0}; int last=1e9; int ans=0; .原创 2021-11-05 22:01:38 · 86 阅读 · 0 评论 -
119. 杨辉三角 II 【滚动数组加优化】
https://leetcode-cn.com/problems/pascals-triangle-ii/class Solution {public: vector<int> getRow(int n) { vector< vector<int> >f(n+1,vector<int>(n+1)); for(int i=0;i<=n;i++) { f[i][0.原创 2021-11-05 21:46:34 · 125 阅读 · 0 评论 -
118. 杨辉三角【经典入门DP】
https://leetcode-cn.com/problems/pascals-triangle/class Solution {public: vector<vector<int>> generate(int n) { vector<vector<int>>f; for(int i=0;i<n;i++) { vector<int>line(i+.原创 2021-11-05 21:33:51 · 212 阅读 · 0 评论 -
70. 爬楼梯 【经典入门题】
https://leetcode-cn.com/problems/climbing-stairs/状态表示: f[i]表示到i阶楼梯的方案数状态转移: f[i]=f[i-1]+f[i-2]class Solution {public: int climbStairs(int n) { int f[100010]={0,1,2}; for(int i=3;i<=n;i++) f[i]=f[i-1]+f[i-2]; return .原创 2021-11-05 21:22:37 · 76 阅读 · 0 评论 -
53. 最大子序和【DP常见的模型】
https://leetcode-cn.com/problems/maximum-subarray/状态表示: f[i]表示以i结尾的最大子段和即f[i]=max(f[i-1]+nums[i],nums[i]) => f[i]=max(f[i-1],0)+nums[i]class Solution {public: int f[100100]; int maxSubArray(vector<int>& nums) { for(.原创 2021-11-04 23:28:33 · 75 阅读 · 0 评论 -
P1002 [NOIP2002 普及组] 过河卒【变种的走方格问题】
https://www.luogu.com.cn/problem/P1002如果没有马的限制那么就是一个很经典的求走方格的路径问题。但是加了马的限制,只需初始化是稍加变种即可。#include<bits/stdc++.h>using namespace std;const int N=55;long long int f[N][N];int n,m,x,y;void init(int x,int y) { f[x][y]=-1;//将其置为不可达 if(!x) for(.原创 2021-11-03 14:57:43 · 78 阅读 · 0 评论 -
P1802 5倍经验日【01背包的扩展】
https://www.luogu.com.cn/problem/P1802这道题还是很有意思的,就是对于每个人你可以打,也可以不打。不过打不打都会获得相应的经验。类比,01背包选不选物品问题,不过在01背包中你不选物品是没有价值的。我们可以,先将所有的不打的经验值加起来,默认都不打(即都不选)然后对于每一个物品构造(win[i]-lost[i])。对于新构造的数组,弄一下01背包即可。#include<bits/stdc++.h>using namespace std;type.原创 2021-11-03 14:47:29 · 114 阅读 · 0 评论 -
P1616 疯狂的采药 【完全背包模型】
https://www.luogu.com.cn/problem/P1616这个是典型的完全背包的模型。和01背包不同的是每个物品可以无限选择。状态表示: f[i][j] 表示从前i个物品中选,总体积不超过j的最大价值对于f[i][j]状态划分:不选第i件物品f[i][j]=f[i-1][j]选第i件物品选1件第i件物品f[i-1][j-1*v[i]]+1*w[i]选2件第i件物品f[i-1][j-2*v[i]]+2*w[i]选3件第i件物品f[i-1][j-3*v[i]]+3*w.原创 2021-11-03 14:30:18 · 135 阅读 · 0 评论 -
P1048 [NOIP2005 普及组] 采药【01背包】
https://www.luogu.com.cn/problem/P1048简单的01背包模型。状态表示f[i][j]表示从前i件物品中选,总体积不超过m的最大价值那么对于第i件物品分开讨论:不选第i件物品f[i][j]=f[i-1][j]选第i件物品f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i])#include<bits/stdc++.h>using namespace std;const int N=1010;int w[N],v[N.原创 2021-11-02 10:42:46 · 79 阅读 · 0 评论 -
P4017 最大食物链计数【拓扑排序】
https://www.luogu.com.cn/problem/P4017就是一个拓扑排序,你会发现生产者都是入度为0的点,最佳消费者是出度为0的点。上图摘自: 御·Dragon https://www.luogu.com.cn/problem/solution/P4017#include<bits/stdc++.h>using namespace std;const int N=1e5*5+10;const int mod=80112002;int h[N],e[N],ne.原创 2021-11-02 09:54:19 · 192 阅读 · 1 评论 -
P2196 [NOIP1996 提高组] 挖地雷【DP和图论的简单结合】
https://www.luogu.com.cn/problem/P2196方法一: dfs爆搜,哈希表存路径#include<bits/stdc++.h>using namespace std;const int N=1e3+10;int h[N],e[N],ne[N],idx;int w[N],st[N],n,x;int ans=0,indexx;unordered_map<int,int>mp,temp;void add(int a,int b) {e[id.原创 2021-11-01 22:23:18 · 145 阅读 · 0 评论 -
P1434 [SHOI2002]滑雪【记忆化搜索DP】
https://www.luogu.com.cn/problem/P1434何为记忆化搜索,本质上就是我们已经知道每一个状态的值了,就无需重复的计算了,减少了时间的消耗。上图摘自:小呆呆大佬#include<bits/stdc++.h>using namespace std;const int N=110;int a[N][N],f[N][N],n,m;int dx[4]={-1,0,0,1};int dy[4]={0,-1,1,0};int dp(int x,int y).原创 2021-11-01 14:44:15 · 184 阅读 · 0 评论 -
P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles【简单的DP递推】
https://www.luogu.com.cn/problem/P1216这是一道非常经典的题目方法一: 从上到小开始递推 不难得出 f[i][j]=max(f[i-1][j-1],f[i-1][j])+w[i][j]对于初始化,无需设置。因为这里的值没有负数,故边界不用设置为负无穷。最后的结果就是在最后一层的所有的结果中取一个max即可。#include<bits/stdc++.h>using namespace std;const int N=1e3+10;int .原创 2021-10-31 22:35:29 · 116 阅读 · 0 评论