动态规划

动态规划思想是将前面处理的结果记录下来,供后来的处理过程直接使用

  • 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]的容量

i-1说的不是回一个,是回的所有中

 

  • 爬楼梯

假设你正在爬楼梯。需要 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[i1][0],dp[i1][1]+prices[i]}

dp[i][1]=max{dp[i1][1],dp[i1][0]prices[i]}

贪心算法没看懂

 

  • 打家劫舍

dp[i]=max(dp[i2]+nums[i],dp[i1])

posted @ 2021-11-26 01:36  wahgon  阅读(39)  评论(0编辑  收藏  举报