最大子数组和 最长递增子序列 最长公共子序列 编辑距离之复习dp
创始人
2024-05-13 03:52:33
0

哥们记得当初刷dp题都做过,但哥们都忘了怎么做的了,来写个备忘录
最大子数组和
如果数组中没有大于0的数,就返回数组中最大的值
否则设一个num,遍历nums数组,如果num加一个数小于0,这个前缀和就可以整体扔掉,否则就更新num,使num成为新的前缀和,前缀和加下一个元素永远比不加前缀和大
更新前缀和的操作也和dp有点像

int maxSubArray(vector& nums) {int num = 0;int ans = 0;int min_val = INT_MIN;int n = nums.size();for(int i = 0;i < n;i++){min_val = max(min_val,nums[i]);if(num+nums[i]>0){num += nums[i];if(num > ans) ans = num;}else num = 0;}if(min_val<0) return min_val;else return ans;}

最长递增子序列
先初始化每个dp都为一
递归每个数之前的数,看前面比它小的数i的dp[i] + 1 哪个更大

int lengthOfLIS(vector& nums) {int len = nums.size();int dp[2505];for (int i = 0; i < len; i++) {dp[i] =1;}int max_value = 1;for (int i = 1; i < len; i++) {for (int j = i-1; j >=0 ; j--) {if (nums[i]>nums[j]){dp[i] = max(dp[i],dp[j]+1);}max_value = max(max_value,dp[i]);}}return max_value;}

最长公共子序列
你要想起来那个表

int longestCommonSubsequence(string text1, string text2) {int len1 = text1.size();int len2 = text2.size();int dp[len1+1][len2+1];memset(dp,0,sizeof(dp));for (int i = 1; i <=len1; i++) {for (int j = 1; j <= len2; j++) {if (text1[i-1] == text2[j-1]) {dp[i][j] = dp[i-1][j-1]+1;}else {dp[i][j] = max(dp[i-1][j],dp[i][j-1]);}}}return dp[len1][len2];}

编辑距离
一开始给dp的初始化很有意思,dp[i][j]的意思是第一个字符串的第i号第二个字符串的第j号,所以dp[i][0]要实现两个字符串相等就要进行i步插入
然后就开始dp
插入

      i              i
a b c d        a b c dj            j x y e        x y e d

所以dp[i][j] = dp[i-1][j] +1,即继续判断第i-1和第j项
替换

      i              i
a b c d        a b c dj              j x y e          x y d

所以dp[i][j] = dp[i-1][j-1] +1
删除

      i              i
a b c d        a b c dj             j-1  j x y e            x y   e(被删除)

仅仅是删除了,并没有保证删除后的两个字符一定相等
所以dp[i][j] = dp[i][j-1] +1

int minDistance(string word1, string word2) {int len1 = word1.size()+1;int len2 = word2.size()+1;int dp[len1][len2];memset(dp,0, sizeof(dp));for (int i = 0; i < len1; i++) {dp[i][0] = i;}for (int i = 0; i < len2; i++) {dp[0][i] = i;}for (int i = 1; i < len1; i++) {for (int j = 1; j if (word1[i-1]==word2[j-1]){dp[i][j] = dp[i-1][j-1];} else {dp[i][j] = 1+min(min(dp[i][j-1],dp[i-1][j]),dp[i-1][j-1]);}}}return dp[len1-1][len2-1];}

相关内容

热门资讯

安卓系统的手机优缺点,全面解析... 你有没有发现,现在市面上手机种类繁多,让人挑花了眼?其中,安卓系统的手机可是占据了半壁江山呢!今天,...
平板有没有安卓系统,安卓系统引... 你有没有想过,平板电脑到底有没有安卓系统呢?这个问题听起来可能有点奇怪,但确实很多人在选购平板时都会...
安卓手机双系统好用不,安卓手机... 你有没有想过,你的安卓手机是不是也能像多面手一样,既能驾驭工作,又能享受娱乐呢?没错,说的就是那个神...
安卓系统怎么登录国际服,一键操... 你有没有想过,为什么有时候你的安卓手机上会出现那些国际服的游戏呢?是不是好奇怎么登录这些神秘的国外服...
安卓系统的时间天气没了,天气功... 最近你的安卓手机是不是也遇到了一个让人头疼的小问题?那就是——时间天气不见了!没错,就是那个曾经陪伴...
安卓好用的拍照系统,捕捉美好瞬... 你有没有发现,现在手机拍照功能越来越强大了?尤其是安卓手机,拍照系统简直让人爱不释手!今天,就让我带...
软件如何兼容安卓8系统,助您软... 你有没有发现,随着科技的飞速发展,手机软件更新换代的速度也是越来越快呢!这不,安卓8系统已经悄然来临...
安卓通用版系统下载,畅享智能生... 你有没有发现,最近手机界又掀起了一股热潮?没错,就是安卓通用版系统下载!这可是个让无数安卓用户兴奋不...
安卓无线点餐系统ph,PH技术... 你有没有想过,点餐也能变得如此轻松愉快?没错,就是那个我们每天都要面对的吃饭问题,现在有了安卓无线点...
安卓门禁系统怎么样,便捷通行新... 你有没有想过,每天回家时,只需轻轻一刷,门就自动打开了?这就是安卓门禁系统的魅力所在!今天,就让我带...
在电脑上模拟安卓系统,探索虚拟... 你有没有想过,在电脑上也能体验安卓系统的乐趣呢?没错,就是那种随时随地都能玩手机的感觉,现在也能在电...
飞机送餐安卓系统,空中美食新体... 你有没有想过,飞机上的美食是如何送到你手中的?是不是觉得这背后有着神秘的力量?其实,这一切都离不开高...
findx耍原生安卓系统,深度... 亲爱的读者们,你是否厌倦了那些花里胡哨的定制系统,渴望回到那个纯净的安卓世界?今天,我要带你一起探索...
一加系统属于安卓系统吗,引领智... 你有没有想过,手机里的那个神奇的“一加系统”到底是不是安卓系统的一员呢?这可是个让人好奇不已的问题哦...
小米2刷安卓系统吗,探索安卓系... 亲爱的读者,你是否曾经对小米2这款手机刷安卓系统的事情感到好奇呢?今天,就让我带你一探究竟,揭开小米...
安卓7.0系统线刷包,深度解析... 你有没有发现,你的安卓手机最近有点儿“蔫儿”了?别急,别急,今天就来给你揭秘如何让你的安卓手机重焕生...
白菜系统和安卓拍照,开启智能生... 你知道吗?最近我在用手机拍照的时候,发现了一个超级酷的功能,简直让我爱不释手!那就是——白菜系统和安...
安卓系统查杀病毒,全方位守护您... 手机里的安卓系统是不是有时候会突然弹出一个查杀病毒的提示?别慌,这可不是什么大问题,今天就来给你详细...
iso系统与安卓各系统哪个好,... 你有没有想过,手机操作系统就像是我们生活中的不同交通工具,各有各的特色和优势。今天,咱们就来聊聊这个...
中柏怎么换安卓系统,解锁更多可... 你有没有发现,中柏的安卓系统有时候用起来还挺不顺手的?别急,今天就来手把手教你如何给中柏手机升级安卓...