Dynamic Programming
Mamba_ZJP
这个作者很懒,什么都没留下…
展开
-
LCP 19.秋叶收藏集 动态规划
题目链接:https://leetcode-cn.com/problems/UlBDOe/这道题拿到手上,直接懵了,感觉dp、贪心什么的都不对,因为题目好像不存在什么序的关系。但是,仔细想想,最后一个叶子必然为红色段(如果叶子本身为yyy,那么肯定要改成rrr),那么到最后一片叶子前面总共修改了几次,那么就看前n−1n-1n−1片叶子总共修改了几次(此时似乎出现了子结构),但是第n−1n-1n−1片叶子可以是处于阶段2(即yyy叶子段)、也可以是处于阶段3(即rrr叶子段)(此时似乎出现了决原创 2020-09-12 21:47:05 · 222 阅读 · 0 评论 -
LeetCode 1575 计数型动态规划(自底向上 + 自顶向下)
题目链接:https://leetcode-cn.com/problems/count-all-possible-routes/#define LL long longclass Solution {private: static constexpr LL MOD = 1e9 + 7; int dp[105][205], n; // dp:最优子结构 到达终点的方案数肯定由到达其他点的,不同油量的方案数求和 // 搜索:反过来 在第 i 个城市到达 fin 的方原创 2020-09-09 21:29:30 · 316 阅读 · 0 评论 -
状态压缩dp例题+分析
牵扯到选不选,而且选择达到的目标给的范围很小的时候,多半可以压缩状态。AcWing 1243: https://www.acwing.com/problem/content/description/1245/#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<vector>#include<string>#in.原创 2020-08-19 16:43:22 · 251 阅读 · 0 评论 -
状态压缩:LeetCode 1542
题目链接:https://leetcode-cn.com/problems/find-longest-awesome-substring/这道题感觉和前缀和的巧妙运用这两个题目有点像,也是子串(子数组)满足某个条件,这里是子串里至多有一个数字出现过奇数次,其余都是偶数次,然后求符合这个条件的子串的最大长度。首先思考下暴力该怎么做:遍历每个数字,然后统计每个数字出现的次数,对于符合条件的子串必定是这样s[0...i−1]s[i...j]s[0...i-1]s[i...j]s[0...i−1]s[i.原创 2020-08-11 20:30:38 · 307 阅读 · 0 评论 -
前缀和的巧妙运用:LeetCode 560/1546
题目链接:https://leetcode-cn.com/problems/subarray-sum-equals-k/class Solution {public: int subarraySum(vector<int>& nums, int k) { //2e4 unordered_map<int, int> rec; rec[0] = 1; int sum = 0, ans = 0; for .原创 2020-08-11 15:51:46 · 234 阅读 · 0 评论 -
[LeetCode 837]:动态规划
题目链接:https://leetcode-cn.com/problems/new-21-game/class Solution {public: double new21Game(int N, int K, int W) { double dp[K + W]; for(int i = 0;i <= W + K - 1;++i){ if(K <= i && i <= N) dp[i] =.原创 2020-06-03 23:28:09 · 552 阅读 · 0 评论 -
动态规划/LeetCode 5
递推顺序:dp(i+1,j-1) -> dp(i,j) ,也就是说当右下标枚举到j-1的时候,i+1的状态必须更新过,所以要把i放在里层循环。正着推的时候,j肯定在j-1后面更新。class Solution {public: string longestPalindrome(string s) { string ans; int n = s.size(); if(n < 2) return s; vector&l..原创 2020-05-21 23:42:38 · 145 阅读 · 0 评论 -
状态压缩/LeetCode 1371
暴力枚举起点i和终点j,同时还要预处理做前缀和,用pre(i,k)表示前i个字符第k个元音字符出现的次数。TC:O(n2),TLE。解题关键在于偶数次,我们需要知道一个前提事实:偶数-偶数=偶数,奇数-奇数=偶数。也就是说当我们遍历到第j个字符时,这时五个元音的奇偶出现次数为一个状态,假如遍历到i个字符(i < j),这时五个元音的奇偶出现次数和第j个是一样的话,j-i就是满足题意的一个子串的长度(所有元音都出现过偶数次)。也就是说我们要记录遍历到每个字符时,前面的所有元音的状态。然后不断更新..原创 2020-05-20 23:32:17 · 327 阅读 · 0 评论 -
多阶段决策/动态规划/Uva 116
回溯法中,每做一次决策,都会生成对于一个当前节点产生一颗子树,结点的层数就是“下一个待填充位置”cur。 ——刘佳汝dp不过就是回溯的返回值用一个表存储起来了,在这里每列都是解答树的一层,每层都要做出决策,而决策就是从前一列可移动过来的格子。很明显,dp(i,j)设为状态,代表(i,j)最小的转移cost。转移方程就是从可移动的三个位置取最小值,然后加上当前格子的cost。要注意的是:这题是环形矩阵,细节看代码。#include<iostream>#include<cs..原创 2020-05-08 23:28:09 · 164 阅读 · 0 评论 -
动态规划/最优子结构/LeetCode 221/LeetCode 1277
LeetCode 221 传送门这题,最开始想用搜索/暴力做,尝试过后,感觉实在麻烦。这题,关键还是要看出最优子结构,从而使用动态规划。每个为1的小方块,要想和大方块合并成为一个更大的方块,只能从 以左上、上方、左边的小方块为右下角的大方块那转移过来,而且只能从这四个里面选一个最小的,不然的话,无法保证其他两个边都有。定义状态:dp[i][j] 以 matrix[i][j] 为右下角的正方形的最大边长。(定义成面积虽然更直观,但是转移的时候很麻烦,要开更号求边长)递推方程:dp(i,j) = m.原创 2020-05-08 23:04:46 · 133 阅读 · 0 评论 -
LeetCode 983最低票价/记忆化搜索/动态规划
此题来自:https://leetcode-cn.com/problems/minimum-cost-for-tickets/这道题刚开始打算用所给的天数直接搜索,即每一个要乘车的天数,都穷举选票策略,然后保留一个参数当作这个票的期限(剩下多少天可以继续乘车)。换个思路,当前第i天买哪个票最划算取决于买个这个票后的i+1/i+7/i+30天之后继续花的钱最少(这是一个贪心策略,很明显如果买了...原创 2020-05-06 12:17:26 · 182 阅读 · 0 评论 -
LeetCode 55/动态规划dp/贪心
此题来自LeetCode 55:https://leetcode-cn.com/problems/jump-game/题目简述:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。这道题一开始想的是记忆化搜索,自顶向下,穷举每个位移长度,然后看是否能到终点,并且用一个memo记录下来,但最后还是TLE。于是...原创 2020-04-17 23:37:28 · 197 阅读 · 0 评论 -
LeetCode 542/动态规划/多源BFS
class Solution {public: vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) { int n = matrix.size(),m = matrix[0].size(); vector<vector<...原创 2020-04-15 23:45:34 · 174 阅读 · 0 评论