1 package number;
2
3 import java.util.Arrays;
4 import java.util.Iterator;
5 import java.util.List;
6 import java.util.Stack;
7
8 /**
9 * @author ycsun E-mail:stevesun521@gmail.com
10 * @version 创建时间:2012-10-3 下午4:35:22 类说明
11 */
12 public class ArraysSeq {
13 private int[] arr;
14
15 public ArraysSeq(int[] arr) {
16 this.arr = arr;
17 }
18
19 /**
20 * On2复杂度
21 */
22 public void maxIncreaseSeq() {
23 int max = 0;
24 int[] lis = new int[arr.length];
25 Arrays.fill(lis, 1);
26 for (int i = 0; i < arr.length; i++) {
27 for (int j = 0; j < i; j++) {
28 if (arr[i] > arr[j] && lis[j] + 1 > lis[i]) {
29 lis[i] = lis[j] + 1;
30 max = max < lis[i] ? lis[i] : max;
31 }
32 }
33 }
34 int pre = Integer.MAX_VALUE;
35 Stack<Integer> stack = new Stack<Integer>();
36 for (int i = lis.length - 1, t = max; i >= 0; i--) {
37 if (t == lis[i] && arr[i] < pre) {
38 t--;
39 pre = arr[i];
40 stack.push(arr[i]);
41 }
42 }
43 while (!stack.isEmpty()) {
44 System.out.print(stack.pop() + " ");
45 }
46 System.out.println();
47 System.out.println("max increase seq length is :" + max);
48
49 }
50
51 /**
52 * On2 DP
53 */
54 public void maxIncreaseSeqDP() {
55 int max = Integer.MIN_VALUE;
56 int[] dp = new int[arr.length + 1];
57 dp[0] = 1;
58 for (int i = 1; i < arr.length; i++) {
59 dp[i] = 1;
60 for (int j = 0; j < i; j++) {
61 if (arr[i] > arr[j]) {
62 dp[i] = Math.max(dp[i], dp[j] + 1);
63 }
64 }
65 }
66 for (int i = 0; i < arr.length; i++) {
67 System.out.print(dp[i] + " ");
68 }
69 System.out.println();
70 for (int i = 0; i < arr.length; i++) {
71 max = Math.max(max, dp[i]);
72 }
73 System.out.println("DP On2 :" + max);
74 }
75
76 /**
77 * DP O(nlogn) maxV[i] 记录长度是i的递增序列的最大元素的最小值 有 i<j 时 maxV[i]<maxV[j]
78 * 反证:如果i<j 有maxV[i]>=maxV[j] ,则有a1,a2.....ai 且有b1,b2....bi....bj ,因为maxV[i]>=maxV[j] ,
79 * 所以a[i]>b[j] => a[i]>=b[j]>b[i] =>a[i] 不是长度是i的递增子序列的最大元素的最小值,矛盾
80 * 所以 有 i<j 时 maxV[i]<maxV[j]
81 */
82 public void maxIncreaseSeqOpt() {
83 int[] maxV = new int[arr.length];
84 maxV[1] = arr[0];
85 int nmax = 1;
86 for (int i = 1; i < arr.length; i++) {
87 int s = 1, e = nmax;
88 while (s <= e) {
89 int mid = (s + e) >> 1;
90 if (maxV[mid] < arr[i]) {
91 s = mid + 1;
92 } else {
93 e = mid - 1;
94 }
95 }
96 nmax = Math.max(nmax, e + 1);
97 maxV[e + 1] = arr[i];
98 }
99 System.out.println(nmax);
100 for (int i = 0; i < maxV.length; i++) {
101 System.out.print(maxV[i] + " ");
102 }
103 System.out.println();
104 }
105
106 /**
107 * DP O(nlogn) minV[i] 记录长度为i的递减序列的最小元素的最大值 有 i>j 时 minV[i]<minV[j]
108 */
109 public void maxDecreaseSeqOPT() {
110 int[] minV = new int[arr.length];
111 int nmax = 1;
112 minV[1] = arr[0];
113 for (int i = 1; i < arr.length; i++) {
114 int s = 1, e = nmax;
115 while (s <= e) {
116 int mid = (s + e) >> 1;
117 if (minV[mid] < arr[i]) {
118 e = mid - 1;
119 } else {
120 s = mid + 1;
121 }
122 }
123 nmax = Math.max(nmax, e + 1);
124 minV[e + 1] = arr[i];
125 }
126 for (int i = 0; i < minV.length; i++) {
127 System.out.print(minV[i] + " ");
128 }
129 System.out.println();
130 System.out.println("max decresase seq is :" + nmax);
131 }
132
133 /**
134 * DP O(n2)
135 */
136 public void maxDecreaseSeqDP() {
137 int max = 1;
138 int[] dis = new int[arr.length];
139 Arrays.fill(dis, 1);
140 for (int i = 0; i < arr.length; i++) {
141 for (int j = 0; j < i; j++) {
142 if (arr[i] < arr[j]) {
143 dis[i] = Math.max(dis[i], dis[j] + 1);
144 }
145 }
146 }
147 for (int i = 0; i < arr.length; i++) {
148 max = Math.max(max, dis[i]);
149 System.out.print(dis[i] + " ");
150 }
151 System.out.println("\nmax decrease seq is :");
152 Stack<Integer> stack = new Stack<Integer>();
153 int prev = Integer.MIN_VALUE;
154 for (int i = dis.length - 1, t = max; i >= 0; i--) {
155 if (t >= 1 && t == dis[i] && arr[i] > prev) {
156 stack.push(arr[i]);
157 t--;
158 }
159 }
160 while (!stack.isEmpty()) {
161 System.out.print(stack.pop() + " ");
162 }
163 System.out.println();
164 }
165
166 public static void main(String args[]) {
167 int[] arr = { 2, 3, 4, 5, 2, 3, 4, 9 };
168 ArraysSeq arraysSeq = new ArraysSeq(arr);
169 arraysSeq.maxIncreaseSeq();
170 arraysSeq.maxIncreaseSeqDP();
171 System.out.println("*******************************");
172 arraysSeq.maxIncreaseSeqOpt();
173 System.out.println("-------------------------------");
174 int[] arr1 = { 9, 4, 3, 2, 5, 4, 3, 2 };
175 ArraysSeq arraysSeq1 = new ArraysSeq(arr1);
176 arraysSeq1.maxDecreaseSeqDP();
177 arraysSeq1.maxDecreaseSeqOPT();
178 }
179 }