![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
记录平时刷题的一些经验、技巧等
源长知
这个作者很懒,什么都没留下…
展开
-
字符串匹配问题-最长公共子序列
问题给定两个字符串str1和str2,输出两个字符串的最长公共子序列。问题分析字符串str1[i]与字符串str2[j]匹配的结果有两种:1.匹配,str1[i]=str2[j],则两个指针都右移一位,继续匹配:i=i+1,j=j+1。2.不匹配,str1[i]!=str2[j],则需要移动指针,有可能存在的情况是,后面str1[i+1]=str2[j]匹配,或str1[i]=str2[j+1]匹配,也可能str1[i+1]=str2[j+1]匹配所以需要进行选择,更新当前位置下所能得到的最大原创 2021-07-24 20:45:46 · 411 阅读 · 0 评论 -
字符串匹配问题-最长公共回文串
问题给你一个字符串 s,找到 s 中最长的回文子串。问题分析回文串特点:顺序和逆序字符相匹配,因此可以等价为字符串s和其逆序字符串s‘的匹配问题。但需要额外注意的是顺序串s和逆序串s’相匹配的子串不一定为回文,如:顺序串s=‘1abc234cba’ 和逆序串 s’='abc432cba1’可以匹配到公共子串‘abc’,但得到的结果并非是回文串。如表所示:s=‘1abc234cba’1abc234cbaa0100000001b0原创 2021-07-24 20:46:13 · 261 阅读 · 0 评论 -
字符串匹配问题-最长公共子串
问题给定两个字符串str1和str2,输出两个字符串的最长公共子串。问题分析利用动态规划,依次匹配str1[i]和str2[j]判断是否相同:1.相同,上一步匹配的子串长度为dp[i-1][j-1],则状态转换dp[i][j] = dp[i-1][j-1]+1,同时记录新的子串匹配的终点indxend;2.不相同,则状态dp[i][j]=0(匹配的是连续公共子串,所以当前字符不匹配,长度更新为0)**注意:若匹配的字符串任意一个位于字符串的起始位置,则说明之前不可能存在匹配的子串,所以dp[i原创 2021-07-23 14:58:08 · 517 阅读 · 0 评论 -
股票买卖问题-含冷冻期
问题给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。问题分析无限次交易,卖出股票后,第二天无法继续交易。状态:持有股票;不持有股票,且处于冷冻期;不持有股票,且不在冷冻期dp[days][3]dp[i][0] 表示第i天持有股票dp[i][1]表示第原创 2021-07-23 14:57:03 · 221 阅读 · 0 评论 -
股票买卖问题-含手续费
问题给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。问题分析不限制交易次数,每次交易都需要收手续费则状态:持有股票,不持有股票两种由于买入-卖出股票,为一次完整的交易,因此只有在每次卖出股票的时候,将手续费考虑进去即可。dp[days][2]dp[i原创 2021-07-23 14:56:21 · 179 阅读 · 0 评论 -
股票买卖问题-最多完成k次交易
问题给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。问题分析类似于问题:股票买卖问题-最多2次交易状态变化有:持有股票:0次持有,第1次持有,第2次持有,…,第k次持有不持有股票:0次不持有,第1次不持有,第2次不持有,…,第k次不持有dp[days][2][k+1]dp[i][0][j]表原创 2021-07-23 14:55:33 · 801 阅读 · 0 评论 -
股票买卖问题-无限次交易
问题给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。问题分析问题类似于:只限制一次交易。状态有:持有股票,不持有股票区别在于持有股票的状态更新时需要考虑上一次不持有股票的状态。而只限制1次交易在更新持有股票的状态时,只需考虑当前股价和上次持有股价哪个价格更低,选择更低的买入。dp[days][2原创 2021-07-23 14:54:42 · 312 阅读 · 0 评论 -
股票买卖问题-最多允许交易2次
问题给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。问题分析最多能完成2笔交易,且不能同时参与多笔交易,则说明一次最多只能持有1只股票,并且卖掉后才能卖第二只股票。状态:买入股票:0次持有,1次持有,2次持有卖出股票:0次持有,1次不持有,2次不持有并且状态转移关系为:0买0买–>1持有0买0买 or 1持有–>1不持原创 2021-07-23 14:53:53 · 790 阅读 · 0 评论 -
股票买卖问题-只允许交易1次
问题给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。例如:输入:prices=[7,1,5,3,6,4],输出:5问题分析买卖股票,则状态有两种:买入股票,卖出股票。且题目中要求了只能买入一次,卖出一次。因此定义:dp[days][2]:第i天原创 2021-07-23 14:52:03 · 475 阅读 · 0 评论 -
0-1背包问题
问题已知一个背包最多能容纳物体的重量为W,现有N个物品,第i个物品的重量为wiw_iwi,价值为viv_ivi。求当前背包能装最大价值的物品为多少。例:容量为W=4,物品个数为N=3,重量为w=[2,1,3],价值为v=[4,2,3]。问题分析在当前剩余容量的条件下,选择使得背包物品价值最大的物品(也可能不选择)。定义动态规划数组:状态:当前剩余容量,则状态数量=w+1个,即0,1,2,…,wdp[i][w]:对于前i个物品,背包容量为w时,能得到的背包最大价值。根据例子,N=3,W=4原创 2021-07-23 14:49:34 · 150 阅读 · 0 评论