#322 零钱兑换(动态规划) 322. 零钱兑换 - 力扣(LeetCode) 注意跳过dp[x]=-1的 class Solution { public: static bool comp(int a,int b){ return a>b; } int coinChange(vector 2024-10-07
#2140 解决智力问题(动态规划) 2140. 解决智力问题 - 力扣(LeetCode) 也许是智力问题罢! 从前向后是错误的,因为dp无法继承/表明brianpower(i),导致结果可能偏大。 从后往前是正确的,因为这样能确保一定不会导致活动出现在brainpower中, class Solution { public: 2024-10-07
#72 编辑距离(动态规划) 72. 编辑距离 - 力扣(LeetCode) 太难了,记一官方题解 https://leetcode.cn/problems/edit-distance/solutions/188223/bian-ji-ju-chi-by-leetcode-solution 2024-10-03
#516 最长回文子序列(动态规划) 516. 最长回文子序列 - 力扣(LeetCode) 同#5 最长回文子串(动态规划) - MOVSX 但是这次dp保存的不是是否为回文串,而是i->j可组成的最长回文子序列长度 状态转移:max(左,右,左下+2(如果s[i]==s[j])) class Solution { public: 2024-10-03
#1218 最长定差子序列(哈希表|动态规划) 1218. 最长定差子序列 - 力扣(LeetCode) 非优化纯动规查找: class Solution { public: int longestSubsequence(vector<int>& arr, int difference) { int n=arr.size( 2024-09-24
#221 最大正方形(动态规划) 221. 最大正方形 - 力扣(LeetCode) 状态描述:dp[i][j]表示,(i,j)作为正方形右下角,其正方形最大边长。 一个边长为a的正方形,(i-1,j),(i,j-1),(i-1,j-1)都应该满足是至少是最大边长为a-1的正方形右下角。 状态转移方程:dp[i][j]=0/(1+m 2024-09-22
刷栏杆Painting Fence(贪心|分治) Problem - 448c - Codeforces 最开始的想法:每次迭代都进行一次刷栏杆的操作,贪心选择目的为刷到更多块,因此对比横刷和竖刷一次能刷的块个数。接着对如果栏杆底部出现分隔(不再连续)则分治。此做法部分正确,贪心选择结果不是全局最优解。 #include<iostream> #in 2024-09-21
01背包问题(动态规划) 很多文章对dp的定义很模糊/不精准 有0->N-1个物品,v[i]为价值,w[i]为开销 状态描述:dp[i][j]为对0->i的物品分别进行购买/不购买的抉择,且至多使用j个背包空间,能获取的最大价值。 求取dp[i][j]时,需要利用dp[i-1][x]的值,对i物品进行抉择:如果w[i]>j, 2024-09-20
#31 下一个排列(字典序) 31. 下一个排列 - 力扣(LeetCode) 从末尾开始,找到第一个降序对,降序对第一个元素标记为k,将k后面的部分升序排列,在后面部分找到第一个大于k的元素与k交换。 class Solution { public: void nextPermutation(vector<int>& 2024-09-18
#122 买卖股票的最佳时机 II(贪心算法) 122. 买卖股票的最佳时机 II - 力扣(LeetCode) 问题转移:df[i]为i-1购入i卖出获得的净收益,df[0]=0。考虑连续盈利情况,例如1买2卖,2卖3卖,等同于1买3卖,因此结果不变。 描述转移后的问题:如何在一定时期内,进行尽可能多的盈利行为。 添加虚拟节点profits=0 2024-09-18