HZNU2012图解

传送门

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 }
原文地址:https://www.cnblogs.com/0424lrn/p/13264394.html