http://acm.pku.edu.cn/JudgeOnline/problem?id=1887
题目叙述很繁琐,其实就是求最长下降子序列,这一类题也是动态规划的典型题。这类问题有两种算法,一种 T(o) = O(n^2),另一种T(o) = O(nlogn),这里用第一种,在1631 Bridging signals的解题报告中介绍第二种。
创建一个一维数组num_array[j],max_array[],num_array[j]表示序列的元素,max_array[i]表示以第i个元素结尾的序列中的最长下降子序列,初始化为1,对于一个max_array[i],遍历前面的每个元素j,如果num_array[j]> num_array[i]且max_array[j]>= max_array[i],那么max_array[j]就要加1,所以递推公式为:
if(num_array[i]<=num_array[j]&&max_array[i]<=max_array[j])
max_array[i]++;
最后选最大的一个max_array[i]就是最长下降子序列的个数。Java关键部分的代码:
for(int i=1;i<length;i++){
for(int j=0;j<i;j++){
if(num_array[i]<=num_array[j]&&max_array[i]<=max_array[j])
max_array[i]++;
}
max_value = (max_array[i]>max_value)?max_array[i]:max_value;
}
max_value是最后的结果。
带有详细注释的代码可以在http://download.csdn.net/user/china8848/获得