最长递增子序列(递增子序列会了,递减子序列也就没问题了)
第一种思路:
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;
}