首页 > 编程知识 正文

字符串中出现最多的子串 leetcode,最长递增子序列的个数

时间:2023-05-06 11:07:22 阅读:32921 作者:4465

主题的最长增量部分序列给出整数数组nums,其中找出最长的严格增量部分序列的长度。

子序列是从数组派生的序列,删除(或不删除)数组中的元素,而不更改其馀元素的顺序。 例如,[3、6、2、7]是数组[0、3、1、6、2、2、7]的子序列。

考虑到题解|动态规划dp[i]这一要素,请注意,以第ii个数字结尾的最长上升子串的长度必须选择nums[i]。

状态转移方程: dp[i]=max(DP[j]1,DP[I] ); (j i ) ) )。

class solution { public : intlengthoflis (vectorintnums ) { int n=nums.size ); vectorintDP(n,1; dp[0]=1; for(intI=1; i n; I ) for(intj=0; j i; j () if ) nums[j]nums[I] ) dp[i]=max(DP[j]1,DP[I] ); } }返回* max _ element (DP.begin )、dp.end ); }; 主题的最长增加部分序列的个数,给出未排序的整数数组,找出最长增加部分序列的个数。

解决问题的动态规划可以基于问题|来统计子系列的数量,从而增加一个cnt容器来记录到达某个位置的子系列的数量。

以主题|为前提:

注意:对于dp[j] 1 dp[i],最大长度增量子序列的长度增加,在dp[i]=dp[j] 1时长度增加,数量保持不变,为count[i]=count[j]

dp[j] 1==dp[i]时,最长递增部分序列的长度没有增加,但长度可以相同,数量可以增加count[i] =count[j]

class solution { public : intfindnumberoflis (vectorintnums ) { int len=nums.size ); VectorintDP(Len,1 ); VectorintCNT(Len,1 ); for(intI=1; i len; I ) for(intj=0; j i; j () if ) nums[j]nums[I] ) if ) DP[j]1DP[I] ) { dp[i]=dp[j] 1; cnt[i]=cnt[j]; }elseif(DP[j]1==DP[I] ) { cnt[i] =cnt[j]; }}}intnum=*max_element(DP.begin )、dp.end ); int ans=0; for(intI=0; i len; I ) if(DP[I]==num ) { ans =cnt[i]; } }返回Ans; }; 最长数给链条n个对。 每一对中,第一个数字总是小于第二个数字。

在此定义跟随关系。 仅对于b c,数(c,d )可以跟在) a,b )之后。 以这种形式一对一地制作链条。

给出数的集合,找出可以形成的最长数的链的长度。 你不需要用所有的数。 也可以按照任何顺序选择其中的几个进行构建。

解决问题的动态计划和第一个问题的想法相同,只是把数字换成数字对,极为相似。

class解决方案{ public : intfindlongestchain (vectorvectorintpairs ) { int len=pairs.size ); VectorintDP(Len,1 ); sort(pairs.Begin )、pairs.end ); for(intI=1; i len; I ) for(intj=0; j i; j () if ) pairs[j][1]pairs[I][0] ) DP[I]=max(DP[I],dp[j] 1); } }返回* max _ element (DP.begin )、dp.end ); };

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。