
动态规划
文章平均质量分 72
Joseph_L_
Ain't no mountain high enough
展开
-
【动态规划】K序列
思路:网赛的时候完全就瞎写,因为当时在想类比最大上升子序列,思路就很乱,最后写了个dfs也跑不动。果然动态规划能行,但是由于思路限制(做dp的题做少了)也没想好。今天看的题解,豁然开朗。两个数组:dp和temp规模都是k,因为我只需要子序列和模k的情况(结果为0~k)对应的最大长度,又是求“最值”,于是联想到动态规划。dp[j]表示算上当前的这个数值,结果为j的最大长度;temp[j]表示不算上当...原创 2018-04-16 16:54:44 · 1069 阅读 · 0 评论 -
【最长非上升子序列】删除最少的元素
其实就是最长上升子序列的一种变相,要求最长非上升子序列,其实就是把大小顺序换一下,替换是去替换子序列中那个第一个比你小的数。分两次,从头和从尾开始,dp[i]表示到达i的子序列长度。加起来-1就是两个序列到i的长度和。#include<iostream>#include<bits/stdc++.h>using namespace std;int main(){ ...原创 2018-03-09 10:51:43 · 596 阅读 · 0 评论 -
【LIS和LCS】最长上升子序列和最长公共子序列
STL中关于二分查找的函数有三个lower_bound 、upper_bound 、binary_search 。这三个函数都运用于有序区间(当然这也是运用二分查找的前提),下面记录一下这两个函数。lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值...原创 2018-03-09 09:21:41 · 318 阅读 · 0 评论 -
【多重背包的优化】
牛逼的是运用二进制的思想来这样拆分,就可以简化for循环的复杂度,又可以达到for单个循环的效果。所以直接记模板: for(int i=1;i<=种类数;i++) { int k=1; //对于每一种,k准备取1 2 4 8... int temp=m[i]; //m[i]为第i种的数量 for(k; k<=temp ;...原创 2018-03-08 19:48:38 · 441 阅读 · 0 评论 -
【动态规划】两条不相交的走迷宫
大致思路:之前走迷宫吃东西的题用dp即可,而这里的dp是要同时对两条不相交的路进行。于是dp数组就用四维的,dp[i][j][k][d]表示同时走到[i][j]和[k][d]时吃东西的最大值,而走到每个点有左上两条路,两个点,则有四种组合情况。所以状态转移方程为:dp[i][j][k][d]=max(max(dp[i-1][j][k-1][d],dp[i-1][j][k][d-1]),max(dp...原创 2018-03-07 20:58:58 · 553 阅读 · 0 评论 -
【LeetCode-动态规划】Triangle
我弄成了dp二维数组,超时,实际上只需要一维数组来保存dp值,也就是说只需要看列号取最小值而不用看行号。// top-down int minimumTotal1(vector<vector<int>>& triangle) { vector<int> res(triangle.size(), triangle[0][0]); for ...原创 2018-03-06 20:26:02 · 209 阅读 · 0 评论 -
【蓝桥杯-动态规划】传娃娃游戏
#include<iostream>#include<bits/stdc++.h>using namespace std;int main(){ int n,m; cin>>n>>m; int dp[35][35]; memset(dp,0,sizeof(dp)); dp[0][1]=1;...原创 2018-02-28 18:04:24 · 562 阅读 · 0 评论 -
【蓝桥杯-动态规划】过河
刚开始很疑惑为什么第二种情况,最快的人送完手电筒要留在河对岸而不是先跟一个人一起走再回来接另一个人。然后发现如果是这样做的话,其实这种情况,应该是包含在一个人的情况里面的,也就是 a[1] 送了 i - 1 以后,就只剩下一个最大的人 i 了,实际上这是情况一的转移。现在做的不仅是比较河边有一个人和有两个人的这两种情况作为状态转移的关键,其实也是在比较最快的人第一次留不留在河对岸的两种情况。...原创 2018-02-28 13:55:26 · 1217 阅读 · 0 评论 -
【蓝桥杯-动态规划】几个例题
因为看到这篇博文竟然有点访问量(跟我的其他博文相比),之前写的比较简陋,确实需要加点东西。如果你是新接触动态规划的,其实你只要理解到:动态规划重点在于“状态转移方程”怎么写。“状态转移方程”就是指两个状态之间应该呈什么样的数学关系。例如 dp[n+1]=f(dp[n]) 这个f函数如何根据题意思考设计。接下来可以看看这几个例子,想想状态转移方程:学到的点:当变量多起来时,用以上的方法书写公式,能更...原创 2018-02-28 10:42:00 · 1546 阅读 · 4 评论 -
【重要】状态压缩DP
const int MAX_N = 20;const int MAX_M = 20;int state[MAX_N + 1];int dp[MAX_N + 1][1 << MAX_M];bool not_intersect(int now, int prev) { return (now & prev) == 0;}bool fit(int now, i...原创 2018-03-09 14:35:58 · 241 阅读 · 0 评论