2.问题描述:
所谓子序列,就是在原序列里删掉若干个元素后剩下的序列,以字符串"abcdefg"为例子,去掉bde得到子序列"acfg"现在的问题是,给你一个数字序列,你要求出它最长的单调递增子序列。
输入:
多组测试数据,每组测试数据第一行是n(1<=n<=10000),下一行是n个比1e9小的非负整数
输出:
对于每组测试数据输出一行,每行内容是最长的单调递增子序列的长度
样例输入:
5
1 2 4 8 16
5
1 10 4 9 7
9
0 0 0 1 1 1 5 5 5
样例输出:
5
3
3
package three;
import java.util.Scanner;
public class SubSequence {
public static void main(String[] args) {
int[] result = null;
int[] data;
Scanner s = new Scanner(System.in);
System.out.println("请输入有多少行数据:");
int line = s.nextInt();
result = new int[line];
System.out.println("开始输入数据:");
for(int i=0; i<line; i++) {
int k = s.nextInt();
data = new int[k];
for(int j=0; j<k; j++) {
data[j] = s.nextInt();
}
int longest[] = new int[k];
for (int j=0; j<k; j++)
longest[i] = 1;
for (int j=1; j<k; j++) {
for (int h=0; h<j; h++) {
//注意longest[j]<longest[i]+1这个条件,不能省略。 (如果是true则说明是当前子序列的数,反之不是当前子序列中的数。)
if (data[j]>data[h] && longest[j]<longest[h]+1){
//计算以data[j]结尾的序列的最长递增子序列长度
longest[j] = longest[h] + 1;
}
}
}
int max = 0;
for (int j=0; j<k; j++) {
//从longest[j]中找出最大值 (即最长递增子序列的长度)。
if (longest[j] > max) max = longest[j];
}
result[i] = max;
}
for(int i=0; i<line; i++) {
System.out.println(result[i]);
}
}
}
参考: http://qiemengdao.iteye.com/
动态规划--子序列
最新推荐文章于 2024-03-21 19:39:57 发布