最长公共子序列,最长上升子序列,最大递增子序列,所有递增子序列

 1 #include <iostream>//abcdab bcdb
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 int main(){
 5     char x[105],y[105];
 6     cin>>x>>y;
 7     int n,m;
 8     n=strlen(x);
 9     m=strlen(y);
10     int dp[106][106]={0};
11     for(int i=1;i<=n;i++){
12         for(int j=1;j<=m;j++){
13             if(x[i]==y[j])
14                 dp[i][j]=dp[i-1][j-1]+1;
15             else
16                 dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
17         }
18     }
19     cout<<dp[n][m]<<endl;
20 } 
View Code
 1 #include <iostream>
 2 using namespace std;
 3 int main(){
 4     int i,j,dp[1010],n,a[1010],ans=0;
 5     cin>>n;
 6     for(i=1;i<=n;i++){
 7         scanf("%d",&a[i]);
 8         dp[i]=1;
 9     }
10     for(i=1;i<=n;i++){
11         for(j=1;j<i;j++){
12             if(a[i]>a[j])
13                 dp[i]=max(dp[i],dp[j]+1);
14         }
15         ans=max(ans,dp[i]);
16     }
17     cout<<ans<<endl;//输出的不是dp[n],我草了  5    5 6 7 1 2
18 }
View Code

 

 

300. 最长递增子序列 - 力扣(LeetCode) (leetcode-cn.com)

 1 class Solution {
 2 public:
 3     int lengthOfLIS(vector<int>& nums) {
 4         int n = nums.size();
 5         vector<int> dp(n,1);
 6         int ans = 0;
 7         for(int i=0;i<n;i++){
 8             dp[i] = 1;
 9             for(int j=0;j<i;j++){
10                 if(nums[i]>nums[j]){
11                     dp[i] = max(dp[i],dp[j]+1);
12                 }
13                     
14             }
15             ans = max(ans,dp[i]);
16         }
17         return ans;
18     }
19 };
View Code

 最大递增子序列  

[1,7,3,5,9,4,8]

输出18

 1 class Solution {
 2 public:
 3     int lengthOfLIS(vector<int>& nums) {
 4         int n = nums.size();
 5         vector<int> dp(n,1);
 6         int ans = 0;
 7         for(int i=0;i<n;i++){
 8             dp[i] = nums[i];
 9             for(int j=0;j<i;j++){
10                 if(nums[i]>nums[j]){
11                     dp[i] = max(dp[i],dp[j]+nums[i]);
12                 }
13                     
14             }
15             ans = max(ans,dp[i]);
16         }
17         return ans;
18     }
19 };
View Code

 

所有子序列之和

1,3,2,4,5  答案23,注意135,25等跨越数的情况

 1 class Solution {
 2 public:
 3     int lengthOfLIS(vector<int>& nums) {
 4         int n = nums.size();
 5         vector<int> dp(n,1);
 6         int ans = 0;
 7         for(int i=0;i<n;i++){
 8             dp[i] = 1;
 9             for(int j=i-1;j>=0;j--){
10                 if(nums[i]>nums[j]){
11                     dp[i] += dp[j];
12                 }
13                     
14             }
15             cout<<dp[i]<<" ";
16             ans += dp[i];
17         }
18         return ans;
19     }
20 };
View Code

 2022/4/23 第三届字节模拟笔试

题目数据 n是1e5 n方过不了

最长递增子序列nlogn解法是用单调数组做!,用数组存储,当然最关键的是,每次都二分查找,找到合适位置直接覆盖。

(6条消息) 最长递增子序列 O(NlogN)算法_反向爆零直至AK的博客-CSDN博客_最长递增子序列nlogn

当然笔试这个题,牵涉到两个值,要用线段树或者树状数组。

posted @ 2020-11-03 13:14  剩下的交给时间就好  阅读(52)  评论(0编辑  收藏  举报