/*
最长递减子序列
如果Array[i]>aArray[j] 第i个数的最长递减子序列的长度 等于 i+1到最后一个数的最长递减子序列的长度 加 1
否则 最长递减子序列的长度就是1;
最后一个数的最长递减子序列的长度等于1,最开始的时候dp[i]的值都为1;
然后倒着求最长递减子序列
如 3,8,7,5,4,6,3,9
dp[0]=1,dp[1]=1;……dp[7]=1;
3<9 不是递减 dp[6]=1;
6>3 递减 dp[5]=dp[6]+1=2;
4>3 递减 dp[4]=dp[6]+1=2;
5>4 递减 dp[3]=max(dp[4],dp[6])+1=3;
7>5 递减 dp[2]=max(dp[3],dp[4],dp[6])+1=4;
8>7 递减 dp[1]=max(dp[2],dp[3],dp[4],dp[6])+1=5;
没有比3小的数 dp[0]=1;
*/
#include<iostream>
using namespace std;
int main(){
int Array[8]={3,8,7,5,4,6,3,9};
int dp[8]; //dp[i]表示以第i个数开始的递减子序列的长度
for(int i=0;i<8;i++){
dp[i]=1;
}
int _max,temp=0;//_max表示最长递减自序列的长度; temp表示最长递减子序列的开始的位置
for(int i=6;i>=0;i--){
_max=0;
for(int j=i+1;j<8;j++){
if(Array[i]>Array[j]){
_max=_max>dp[j]?_max:dp[j]; //小于第i个数并且最长的递减子序列
}
}
dp[i]=_max+1>dp[i]?_max+1:dp[i];
}
_max=dp[0];
for(int i=1;i<8;i++){
if(_max<dp[i]){
_max=dp[i];
temp=i;
}
}
cout<<_max<<endl;
cout<<Array[temp]<<" ";
for(int i=temp+1;i<8;i++){
if(dp[temp]==dp[i]+1&&Array[i]<Array[temp]){
cout<<Array[i]<<" ";
temp=i;
}
}
return 0;
}
最长递减子序列
如果Array[i]>aArray[j] 第i个数的最长递减子序列的长度 等于 i+1到最后一个数的最长递减子序列的长度 加 1
否则 最长递减子序列的长度就是1;
最后一个数的最长递减子序列的长度等于1,最开始的时候dp[i]的值都为1;
然后倒着求最长递减子序列
如 3,8,7,5,4,6,3,9
dp[0]=1,dp[1]=1;……dp[7]=1;
3<9 不是递减 dp[6]=1;
6>3 递减 dp[5]=dp[6]+1=2;
4>3 递减 dp[4]=dp[6]+1=2;
5>4 递减 dp[3]=max(dp[4],dp[6])+1=3;
7>5 递减 dp[2]=max(dp[3],dp[4],dp[6])+1=4;
8>7 递减 dp[1]=max(dp[2],dp[3],dp[4],dp[6])+1=5;
没有比3小的数 dp[0]=1;
*/
#include<iostream>
using namespace std;
int main(){
int Array[8]={3,8,7,5,4,6,3,9};
int dp[8]; //dp[i]表示以第i个数开始的递减子序列的长度
for(int i=0;i<8;i++){
dp[i]=1;
}
int _max,temp=0;//_max表示最长递减自序列的长度; temp表示最长递减子序列的开始的位置
for(int i=6;i>=0;i--){
_max=0;
for(int j=i+1;j<8;j++){
if(Array[i]>Array[j]){
_max=_max>dp[j]?_max:dp[j]; //小于第i个数并且最长的递减子序列
}
}
dp[i]=_max+1>dp[i]?_max+1:dp[i];
}
_max=dp[0];
for(int i=1;i<8;i++){
if(_max<dp[i]){
_max=dp[i];
temp=i;
}
}
cout<<_max<<endl;
cout<<Array[temp]<<" ";
for(int i=temp+1;i<8;i++){
if(dp[temp]==dp[i]+1&&Array[i]<Array[temp]){
cout<<Array[i]<<" ";
temp=i;
}
}
return 0;
}