/*单调递增子序列(二)
时间限制:1000 ms | 内存限制:65535 KB
难度:4
描述
给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。
如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。
输入
有多组测试数据(<=7)
每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,
表示数列中的所有元素.每个整形数中间用空格间隔开(0<n<=100000)。
数据以EOF结束 。
输入数据保证合法(全为int型整数)!
输出
对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。
样例输入
7
1 9 10 5 11 2 13
2
2 -1
样例输出
5
1*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class NYOJ_214 {
static int[] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String n = null;
while ((n = br.readLine()) != null) {
int[] data = new int[Integer.parseInt(n)];
String in[] = br.readLine().split(" ");
for (int i = 0; i < data.length; i++)
data[i] = Integer.parseInt(in[i]);
int maxcount = 1;
dp = new int[data.length + 1];
dp[1] = data[0];
for (int i = 1; i < data.length; i++) {
int left, right, mid;
left = 1;
right = maxcount;
// 二分查找
while (left <= right) {
mid = (left + right) / 2;
if (dp[mid] < data[i])
left = mid + 1;
else if (dp[mid] > data[i])
right = mid - 1;
else {
left = mid;
break;
}
}
dp[left] = data[i];
if (left > maxcount)
maxcount = left;
}
System.out.println(maxcount);
}
}
}
NYOJ-214(动态规划)-题目----------------------------- 单调递增子序列(二)
最新推荐文章于 2015-03-27 10:22:54 发布