最大递增子序列

最大递增子串

<1,2,3,8,4>最大递增子串应为<1,2,3,4>,长度为4。
解法:动态规划
len[1] = 1,表示下标为1且以1为最大元素的子串
len[2] = 2, 表示下标为2且以2为最大元素的子串
len[3] = 3, 表示下标为3且以3为最大元素的子串
len[5] = ?, 表示下标为5且以4为最大元素的子串,那么问号处的值是多少呢?
从8开始向前遍历,找到比4小的元素a[i],可能会找到多个a[i],然后选取len[i]中最大的那个加1就是len[5]的值。例如,我们先找到3发现len[3]=3,难么len[3]是不是最大的呢?继续往前找,找到了2,发现len[2]比len[3]小,然后在往前找,找到了1,发现len[1]还比len[3]小,所以len[5] = len[3]+1 = 4;
所以最大子串长度为4;

import java.util.Scanner;

public class Test {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			String str = sc.nextLine().replace(" ", "");
			char[] arr = str.toCharArray();
			int[] len = new int[arr.length + 1];
			// len[i]表示以arr[i]为最大元素的子串长度
			int max = 0;
			len[1] = 1; // len[1]对应a[0]
			for (int i = 1; i < arr.length; i++) {
				for (int j = i - 1; j >= 0; j--) {
					if (arr[j] < arr[i] && len[j + 1] > max)
						max = len[j + 1];
				}
				len[i + 1] = max + 1;
			}
			max = 0;
			for (int i = 1; i < len.length; i++)
				if (max < len[i])
					max = len[i];
			System.out.println(max);
		}
	}
}
posted @ 2017-03-22 09:53  被罚站的树  阅读(225)  评论(0)    收藏  举报