1.最长递增子序列(Longest Increasing Subsequence,LIS)
例:{1,4,3,2,6,5}
F(1) F(2) F(3) F(4) F(5) F(6) 1 2 2 2 3 3
F[i]:表示第i个元素前的最长递增子序列长度
Longest Increasing Subsequence Example's Code:
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
int main(){
vector<int> a(26,0);
vector<int> dp(26,0);
int n;
dp[1]=1;
while(cin>>n){
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=2;i<=n;i++){
int mdp=1;
for(int j=i-1;j>=1;j--)
if(a[j]<=a[i])
mdp=max(mdp,dp[j]+1);
dp[i]=mdp;
}
for(int i=1;i<=n;i++)
cout<<dp[i]<<" ";
cout<<endl;
}
return 0;
}
/**
6
1 4 3 2 6 5
*/
*扩展(最长递减子序列(Longest Diminishing Subsequence)
例:{300,207 ,155 ,300 ,299 ,170, 158, 65}
F(1) F(2) F(3) F(4) F(5) F(6) F(7) F(8) 1 2 3 2 3 4 5 6
Longest Diminishing Subsequence Example's Code:
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
int main(){
vector<int> a(26,0);
vector<int> dp(26,0);
int n;
while(cin>>n){
for(int i=1;i<=n;i++)
cin>>a[i];
dp[1]=1;
for(int i=2;i<=n;i++){
int mdp=1;
for(int j=i-1;j>=1;j--){
if(a[j]>=a[i]){
mdp=max(mdp,dp[j]+1);
}
}
dp[i]=mdp;
}
for(int i=1;i<=n;i++)
cout<<dp[i]<<" ";
cout<<endl;
}//时间复杂度O(n^2),空间复杂度O(n);
return 0;
}
/**
8
300 207 155 300 299 170 158 65
6
*/