随笔分类 - 动态规划
摘要:题目 题解,动态规划 因为m 最大只有5,所以我们可以枚举5个相邻的块,最多有多少种可能, 然后分析每个是否能与其他几个并排,然后就是简单的BP了 class Solution { public: int dp[50][5]; int bp[5]; int num[50]; long long in
阅读全文
摘要:题目 题解: 动态规划,用二进制压缩状态,注意分析几种情况,就能推出来正确的状态转移方程。 class Solution { public: int dp[12][4096]; int connectTwoGroups(vector<vector<int>>& cost) { int n = cos
阅读全文
摘要:题目 题意:一堆橘子,要么吃一个,如果橘子数量能被2整除就可以吃一半,如果橘子数量能被3整除就可以吃三分之二,请问最少几次能吃完? 题解:橘子的个数是n,按照贪心的思想,肯定是吃一半或者吃三分之二划算。因此每一步,都有两种选择,要么一个一给吃,吃到能被2整除,然后吃掉一半。要么一个一个吃,吃到能被3
阅读全文
摘要:题目 区间DP,由于棍子长100万,所以我们在cuts之间做区间DP。 那么状态转移方程就是很简单直白的区间DP dp[i][j] = min { dp[i][k-1] + cost(k) + dp[k+1][j]} i<=k<=j cost(k) 表示 从k处切断的cost class Solut
阅读全文
摘要:题目 题意:在一个数组中,找到最多的不相交的子序列,每个子序列的和等于target。 题解:动态规划 dp[i]表示从0到i的子数组的答案。维护前缀数组sums[],我们维护一个记录前缀和的map,map[x]表示前缀和是x距离当前i最近的下标。 那么状态转移方程就是dp[i] = max(dp[i
阅读全文
摘要:题目 一道好题目,把最长递增子序列扩展到二维,但是这道题和最长递增子序列是有区别的,它不要求是序列,只是在数组中找到一组最长的组合,不要求顺序在初始中相同。 这是个二维的最长递增子序列,由于没有顺序限制,所以我们把第一维进行排序,然后对第二维进行动态规划 接下来就和最长递增子序列的思路一样: 效率是
阅读全文
摘要:题目 动态规划 class Solution { public: int dp[10005]; int coinChange(vector<int>& coins, int amount) { memset(dp,-1,sizeof(dp)); dp[0] = 0; for(int i=1;i<=a
阅读全文
摘要:题目 动态规划 class Solution { public: string dp1[100005]; string _dp1[100005]; string dp2[100005]; string bp1[100005]; string _bp1[100005]; string bp2[1000
阅读全文
摘要:题目 动态规划 dp[i][0] 表示当天什么都不操作 dp[i][1] 表示当天买进 dp[i][2] 表示当天卖出 状态转移就好写出了 class Solution { public: long long int dp[10005][3]; int maxProfit(vector<int>&
阅读全文
摘要:题目 删除最少的括号,让所有括号匹配起来。 大部分都是用DFS,或者BFS。我用的DP,也可以过 dp[i][j] :means it need remove at least dp[i][j] characters to get vaild parenthese from position i t
阅读全文
摘要:题目 经典题目,最长递增子序列。 有O(n2)效率,还有O(n*logn)效率的。 O(n2)的效率很好理解的啦,就是大家最常见的那种DP O(n*logn) 的方法是维护一个递增的栈,这个栈不等于最长递增子序列。但是数组的长度一定是等于最长递增子序列的长度的。 遍历原始数组,每次的操作是把当前元素
阅读全文
摘要:"题目" 动态规划
阅读全文
摘要:"题目" 题解:区间DP dp[i][j] 表示i j的所有灯泡都熄灭了之后,能获得最大价值
阅读全文
摘要:"题目" DP 险过。 dp[i][j] :means it need remove at least dp[i][j] characters to get vaild parenthese from position i to postion j in string. vector str[i][
阅读全文
摘要:"题目" 题解:动态规划
阅读全文
摘要:"题目" 和这道题目 https://www.cnblogs.com/dacc123/p/12295924.html 一样,改进了一点,就是首尾也是相邻的。 那么我们在DP的时候,还要考虑第一个房子有没有被抢劫的情况。所以状态数组变成了DP[i][j][k],j表示i个房子是否抢劫,k表示第1个房子
阅读全文
摘要:"题目" 题意:给你一个数组表示一个街道,每个数字表示一个房子里有多少钱,你可以打劫获得这些钱,但是不能同时打劫相邻的房子,问你最多可以得到多少钱, 题解:动态规划,DP[i][0]表示第0个房子没有打劫,DP[i][1] 表示第1个房子打劫了。
阅读全文
摘要:"题目" 1349. Maximum Students Taking Exam Add to List Share Given a m n matrix seats that represent seats distributions in a classroom. If a seat is bro
阅读全文
摘要:"题目" 题意:给你一个数组代表每天的股价。你有k次买入和卖出的机会,问你最多能赚多少钱。买入之前必须卖出已有股份。同一天是可以先买,再卖,或者先卖再买的。 题解:题目没有说数据范围,但是经过我实际测试 k 最大为10^8 ,n最大为10^4。当然k最多只需要取n/2就好了,因为当天买当天卖是没有意
阅读全文
摘要:"题目" 题意:每个格子里都有数字,负数代表你会少血,正数代表你会加血,当你的血量为0的时候就死了,从左上角出发,到右下角,问你一开始最少的血量是多少。整个过程中不能有血量为0的情况。 题解:只能走下或者走右。这种有向无环图,八成都是动态规划。但是如果从左上角开始规划,有很多情况要考虑。从右下角开始
阅读全文