蓝桥杯——说好的进阶之最长递增子序列

所谓子序列,就是在原序列里删掉若干个元素后剩下的序列,以字符串”abcdefg”为例子,去掉bde得到子序列”acfg”

现在的问题是,给你一个数字序列,你要求出它最长的单调递增子序列。

/*
	 * 输入:1 5 3 2 4 7
	 * 
	 * 输出:1 2 4 7
	 */
	static int[] iarr;
	static int[] v;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		String[] sarr = scanner.nextLine().split(" ");
		iarr = new int[sarr.length];
		v = new int[iarr.length];
		for (int i = 0; i < sarr.length; i++) {
			iarr[i] = Integer.parseInt(sarr[i]);
		}

		cal();

	}

	static void cal() {
		for (int i = 1; i < iarr.length; i++) {
			for (int j = i - 1; j >= 0; j--) {
				if (iarr[j] < iarr[i]) {
					if (v[j] >= v[i]) {
						v[i] = v[j] + 1;
					}
				}
			}
		}

		int max = 0;
		for (int i : v) {
			if (max < i) {
				max = i;
			}
			// System.out.print(i+" ");
		}

		System.out.println("length:" + (max + 1));
		int[] tmp = new int[max + 1];
		int p = 0;
		for (int i = v.length - 1; i >= 0; i--) {
			if (v[i] == max) {
				tmp[p++] = iarr[i];

				max--;
			}
		}
		System.out.print("最长递增子序列:");
		for (int i = 0; i < tmp.length; i++) {
			System.out.print(tmp[tmp.length - i - 1] + " ");
		}
	}


你可能感兴趣的:(java,算法,蓝桥杯,进阶)