Description
6月的雨总是来得莫名其妙淅淅沥沥根本停不下来,就在这种让人烦躁的季节,MWY毅然决然的选择通过计算他自己定义的“最大上升天数”来判断自己是否需要甩了CJC。“最大上升天数”的意思是,在连续的十天内,如果下雨时长数组是{2,1,3,4,5,6,7,8,1,10},第一天时长大于第二天,所以{2,1}是下降的,而{2}或{1}是上升的并且只有一个元素,所以前两天的最大上升天数是1。前三天的上升天数是2,应为{2,3}或者{1,3}(请注意{1,3}也是符合的)是上升的并且在上升的序列里面有两个元素。请帮MWY写一个计算最大上升函数的代码。
Input
十个整数N,用空格隔开(1<=N<=24)
Output
输出最大上升天数。
Samples
input
12 11 7 24 1 7 9 8 10 22
output
5
题意:在给出的十天中,找到一个(不连续但按顺序的)单调递增的最长子序列,输出这个子序列的长度。
(尝试回忆了一下上个学期第一次看到这个题目的时候,觉得好简单,但是怎么写??数组不长,我们肉眼就能筛选出符合条件的最长子序列,可是要怎么写成代码呢)
定义一个数组用于存放每天的下雨时长:
当天数只有一天的时候,那么第一天(此处为a[0])本身,就是最长子序列,长度为1。
当天数增加到两天,我们需要判断第二天的下雨时长是否大于第一天。发现并没有,那么这两天的最长子序列是a[0] 或 a[1],长度为1。
同理增加到三天的时候,最长子序列是a[0] 或 a[1] 或 a[2],长度为1。
当天数增加到四天的时候,a[3]比前面任何一天都大,但之前的最长子序列都为1,则 a[3] 不管跟在哪个序列后面都行,最长子序列增长为2。
五天。
六天的时候,a[5] 大于 a[4],而 a[4]所在序列长度为1,a[5] 加入以后长度增加到2。
七天的时候,a[6] 大于 a[2]、a[4]、a[5],而我们需要挑选其中最长的子序列,并将a[6]插到末尾即可,长度增加到3。
同理八天的时候,将a[7] 插在允许的最长子序列之后,长度为3。
九天。
十天。
通过这个图解过程,我们应该可以很容易地看出这个方法的主要思想,即在遍历数组的过程中,将数据插在最理想即最长的序列之后。要用代码实现这个方法,也不难,只要两重循环就能实现,不再赘述,直接看代码。
1 #include<stdio.h> 2 int main(){ 3 int a[10], b[10]; 4 int maxb=-1; 5 6 for(int i=0; i<10; i++){ 7 scanf("%d", a+i); 8 b[i] = 1; 9 } 10 11 for(int i=0; i<10; i++) 12 for(int j=0; j<i; j++) 13 if(a[i]>a[j] && b[i]<=b[j]) 14 b[i] = b[j] + 1; 15 16 for(int i=0; i<10; i++) 17 if(b[i] > maxb) 18 maxb = b[i]; 19 20 printf("%d ", maxb); 21 return 0; 22 }