动态规划思想是将前面处理的结果记录下来,供后来的处理过程直接使用
- 01背包
有N件物品和一个容量为V的背包。第i件物品的体积是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
f[i,v] = max(f[i-1][v], f[i-1][v-c[i]] + w[i])
答:一开始总是以为f[i-1][v-c[i]] + w[i]求的是i-1的重量+w[i],这样肯定比前面那个大,那max有什么用,原来要减去v-c[i]的容量
- 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
答:f(n) = f(n-1) + f(n-2)
- 最长递增子序列
给你一个整数数组nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
答:f(n) = max(f(i<n))+1
- 不同的子序列
给定一个字符串s和一个字符串t,计算在s的子序列中t出现的个数。
字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,"ACE"是"ABCDE"的一个子序列,而"AEC"不是)
题目数据保证答案符合32位带符号整数范围。
答:dp[i][j] = dp[i - 1][j - 1] + dp[i][j - 1]
当遍历到t[i]=s[j]时,即最后一个字符相等,这时有两种情况
一种是t[i]匹配了s[j],个数相当是dp[i - 1][j - 1]
二种是t[i]没匹配了s[j],那肯定是匹配了s[j]之前的字符,个数相当是dp[i][j - 1],所有两者相加
当遍历到t[i]!=s[j]时,t[i]肯定不匹配s[j],所以个数只有dp[i][j - 1]
- 让字符串成为回文串的最少插入次数
给你一个字符串s,每一次操作你都可以在字符串的任意位置插入任意字符。
请你返回让s成为回文串的最少操作次数。
「回文串」是正读和反读都相同的字符串。
答:
dp[i][j] = min(dp[i + 1][j] + 1, dp[i][j - 1] + 1) if s[i] != s[j]
dp[i][j] = min(dp[i + 1][j] + 1, dp[i][j - 1] + 1, dp[i + 1][j - 1]) if s[i] == s[j]
leetcode
le ee et tc co od de
lee eet etc tco cod ode
leet eetc etco tcod code
......
这题难懂
- 买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意:你不能在买入股票前卖出股票。
答:prices[i] - minprice
- 买卖股票的最佳时机 II
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
答:
dp[i][0]=max{dp[i−1][0],dp[i−1][1]+prices[i]}
dp[i][1]=max{dp[i−1][1],dp[i−1][0]−prices[i]}
贪心算法没看懂
- 打家劫舍
dp[i]=max(dp[i−2]+nums[i],dp[i−1])