题目:
你有个同学叫小明,他早听闻祖国河山秀丽,于是有一个爬山的计划,并列了一张所有山的高度表,而又因“人往高处走”的说法,所以他希望爬的每一座山都比前一座要高,并且不能改变山的高度表上的顺序,爬的山数还要最多,请贵系的你帮他解决这个问题。
输入第一行为num,代表山的个数。
输入第二行有num个整数,代表每座山的高度。
输出只有一个数,为符合要求的最大爬山数。
分析:
要求“一定顺序序列中最长的子序列”,可以用递归,也可以用动态规划。
思路:从第一个开始,我们要计算每次向后走一位时构成序列的最大值。即用前i个数的最大序列数进行下次计算,每次都将计算比较得到的最大值存起来,最后输出整体的最大值。一句话就是:用前面算好的最优结果进行下一轮计算。
用公式表达:在前i个数里,遍历第1到第i-1个数(我们用j表示),如果s[j]<s[i](s是原始数据的列表),而且k[j](意思是现在算到 j 这个位置的长度最大值,k是用来存最大值的列表,大小是[1]*num,因为我们要计算num这么多次。)+1(加上s[i]本身)>k[i](计算到i的最大值),那么就更新k[i].即:if s[j]<s[i] and k[j]+1>k[i]:k[i]=k[j]+1.有的也写作:if s[j]&