/*
*最长递增子序列
*找到给定的序列中的最长递增子序列
*采用动态规划的思想,首先给一些已经知道的量赋值,之后
*根据已知的量求当前的量,当前的量需要和以前的量进行对比,
*如果当前的值比以前的要大的话,以前位置处的序列长度加1
*如果找完了也没找到比他要小的数据的话,此位置的最长递增子序列就是1
*每次往前找都找前面整个序列最大的
*/
#include "iostream"
using namespace std;
int main()
{
//定义数组并初始化数据信息
int n = 0;
cin>>n;//序列的数据量
int arr[100] = {0};//存放数据
int listLen[100] = {0};//存放下标处的最长的子序列
int maxSubListLen = 1;
//接收输入的n个数据
for(int i = 0;i<n;i++)
{
cin>>arr[i];
}
//初始化写listLen数组中的数据
listLen[0] = 1;
for(int i = 1;i<n;i++)
{
listLen[i] = 1;
int max = listLen[i];
int min = 65536;
for(int j = 0;j<i;j++)
{
if(arr[j]<arr[i])//比当前的这个位置数据小,就有可能成为别人的成就者
{
if(listLen[j]+1>max)//找一个长的序列
{
max = listLen[j] + 1;
}
}
}
listLen[i] = max;
if(maxSubListLen<max)
{
maxSubListLen = max;
}
}
cout<<maxSubListLen;
return 0;
}
/*
*最长递减子序列
*找到给定的序列中的最长递减少子序列
*采用动态规划的思想,首先给一些已经知道的量赋值,之后
*根据已知的量求当前的量,当前的量需要和以前的量进行对比,
*如果当前的值比以前的要小的话,以前位置处的序列长度加1
*如果找完了也没找到比他要大的数据的话,此位置的最长递增子序列就是1
*每次往前找都找前面整个序列最大的
*和最长递增子序列属于同一类思想,此处是求最长递减
*/
#include "iostream"
using namespace std;
int main()
{
//定义数组并初始化数据信息
int n = 0;
cin>>n;//序列的数据量
int arr[100] = {0};//存放数据
int listLen[100] = {0};//存放下标处的最长的子序列
int maxSubListLen = 1;
//接收输入的n个数据
for(int i = 0;i<n;i++)
{
cin>>arr[i];
}
//初始化写listLen数组中的数据
listLen[0] = 1;
for(int i = 1;i<n;i++)
{
listLen[i] = 1;
int max = listLen[i];
for(int j = 0;j<i;j++)
{
if(arr[j]>=arr[i])//找前面比自己大或者等于的数据
{
if(listLen[j]+1>max)//找一个最长的序列
{
max = listLen[j] + 1;
}
}
}
listLen[i] = max;
if(maxSubListLen<max)
{
maxSubListLen = max;
}
}
cout<<maxSubListLen;
return 0;
}