妙:
把输入序列非递减排序,然后求这两个序列的最长公共子串LCS
#include<iostream>
#include<algorithm>
using namespace std;
int c[10000][10000];
void LCS(int m, int *a, int *b){
//m是两个数组长度,数组从下标为1开始
int i, j;
for(i=1; i<=m; i++){
c[i][0] = 0;
}
for(i=1; i<=m; i++){
c[0][i] = 0;
}
//把下标有0的先初始化为0
for(i=1; i<=m; i++){
for(j=1; j<=m ; j++){
if(a[i] == b[j]){
c[i][j] = c[i-1][j-1] + 1;
}
else if(c[i-1][j] >= c[i][j-1]){
c[i][j] = c[i-1][j];
}
else{
c[i][j] = c[i][j-1];
}
}
}
}
int main(){
int n;
int a[10000];
int b[10000];
cin>>n;
for(int i=1; i<=n; i++){
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+n+1);
/* for(int i=1; i<=n; i++){
cout<<b[i];
}*/
LCS(n, a, b);
cout<<c[n][n];
}