最长递增子序列
Posted WayToAccept
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长递增子序列相关的知识,希望对你有一定的参考价值。
最长递增子序列(递增子序列会了,递减子序列也就没问题了)
第一种思路:
a[i]在最长子序列的位置为dp[i]
dp[i]=max(1,dp[j]+1) s.t. 0<=j<i 且a[j]<a[i]
第二种思路:
对a[i]排序的b[i]
求a[i]与b[i]的最长公共子序列
第一种思路代码:
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iterator>
#include <algorithm>
using namespace std;
int a[100];
int b[100];
int ASC(int a[],int n)
b[0]=1;
int max=1;
for(int i=1;i<n;++i)
int maxj=0;
for(int j=0;j<i;++j)
if(a[j]<a[i]&&b[j]>maxj)maxj=b[j];
b[i]=maxj+1;
if(max<b[i])max=b[i];
return max;
int main()
int n;
while(cin>>n)
for(int i=0;i<n;++i)
cin>>a[i];
int max=ASC(a,n);
cout<<max<<endl;
return 0;
第二种思路代码
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iterator>
#include <algorithm>
using namespace std;
int a[100];
int b[100];
int arr[101][101]=0;
void AdjHeap(int arr[],int i,int n)
int left=2*i+1,right=2*i+2;
int maxi=i;
if(left<n&&arr[left]>arr[maxi])
maxi=left;
if(right<n&&arr[right]>arr[maxi])
maxi=right;
if(maxi!=i)
int temp=arr[maxi];
arr[maxi]=arr[i];
arr[i]=temp;
AdjHeap(arr,maxi,n);
void Heap(int arr[],int n)
for(int i=(n-1)/2;i>=0;--i)
AdjHeap(arr,i,n);
for(int i=n-1;i>0;--i)
int temp=arr[0];
arr[0]=arr[i];
arr[i]=temp;
AdjHeap(arr,0,i);
int LCS(int a[],int m,int b[],int n)
int max=0;
for(int i=0;i<m;++i)
for(int j=0;j<n;++j)
if(a[i]==b[j])
arr[i+1][j+1]=arr[i][j]+1;
else
arr[i+1][j+1]=arr[i][j+1]>arr[i+1][j]?arr[i][j+1]:arr[i+1][j];
if(arr[i+1][j+1]>max)max=arr[i+1][j+1];
return max;
int main()
int n;
while(cin>>n)
for(int i=0;i<n;++i)
cin>>a[i];
b[i]=a[i];
Heap(b,n);
int max=LCS(a,n,b,n);
cout<<max<<endl;
return 0;
以上是关于最长递增子序列的主要内容,如果未能解决你的问题,请参考以下文章