最长公共子序列,最长上升子序列,最大递增子序列,所有递增子序列
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 }
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 }
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 };
最大递增子序列
[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 };
所有子序列之和
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 };
2022/4/23 第三届字节模拟笔试
题目数据 n是1e5 n方过不了
最长递增子序列nlogn解法是用单调数组做!,用数组存储,当然最关键的是,每次都二分查找,找到合适位置直接覆盖。
(6条消息) 最长递增子序列 O(NlogN)算法_反向爆零直至AK的博客-CSDN博客_最长递增子序列nlogn
当然笔试这个题,牵涉到两个值,要用线段树或者树状数组。