鹏神意外得到了神灯。
神灯中冒出了灯神,灯神说道:“我将给你一个有序的数列,你可以在保证原有顺序不变的前提下,挑出任意多的数。如果你挑出的数字是严格升序的,那么这段数字的个数就是你女朋友的个数。”
“妈的智障。”鹏神骂道。
但是鹏神还是希望自己能有尽可能多的女朋友。所以他求救于你,希望你能帮他算出他最多能有多少女朋友。
输入包含多组数据。
第一行是以为整数N,表示灯神给出的数列的长度。(1≤N≤1000)
第二行包含N个整数,即是灯神给出的序列。
对于每组输入数据,请输出最终答案,即鹏神最多可以得到的女朋友个数。
7
1 7 3 5 9 4 8
4
在样例中,鹏神可以挑出1、3、5、9 或者1、3、5、8,都是4个数字。
算法:/*题目是求最长上升子序列,DP问题。
a[i]是表示输入的数据,dp[i] 是表示第i个数字和它之前a[0]到a[i-1]的数字构成的最大上升序列的长度值。
例如 七个数字
1 7 3 5 9 4 8 分别存在a[0]到a[6]中。那么对应的dp[0]到dp[6]的值就是
1 2 2 3 4 3 4
dp[0]就是1,本身成一个序列。
dp[1]是2,构成的最长上升子序列是 1 7 .长度为2.
dp[2]是2,构成的最长上升子序列是 1 3 .长度为2.
dp[3]是3,构成的最长上升子序列是 1 3 5 .长度为3.
。。。。。。
求出dp数组所有的值,用一个for循环找出最大值,就是题目要求的最长上升子序列的值。
由此题可以简单的想到最长下降子序列,只需要改动一个大于号就可以了。
*/
#include<stdio.h>
#include<string.h>
#define MAX 1005
int a[MAX],dp[MAX];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a)); //初始化数组。
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
dp[0]=dp[1]=1;
for(int j=2;j<=n;j++) //二重循环求dp数组。
{
int temp=0;
for(int i=1;i<j;i++)
{
if(a[i]<a[j]) // 找出在这个数之前比它小的数字。
{
if(temp<dp[i])
{
temp=dp[i]; // 找出比这个数字小的数字里的最大的dp值。就是长度值。
}
}
}
dp[j]=temp+1; //加一就是这个数字的dp值。
}
int sum=dp[0];
for(int i=1;i<n;i++)
{
if(dp[i+1]>sum)
sum=dp[i+1];
}
printf("%d\n",sum);
}
return 0;
}