diff --git a/src/class47/Code02_RestoreWays.java b/src/class47/Code02_RestoreWays.java index 4bcf8d0..6069378 100644 --- a/src/class47/Code02_RestoreWays.java +++ b/src/class47/Code02_RestoreWays.java @@ -90,10 +90,6 @@ public class Code02_RestoreWays { public static int ways2(int[] arr) { int N = arr.length; int[][][] dp = new int[N][201][3]; - // dp[0][...][...] - // dp[0][...][2] = 0 - // dp[0][...][0] = 1 - // dp[0][...][1] = 1 if (arr[0] != 0) { dp[0][arr[0]][0] = 1; dp[0][arr[0]][1] = 1; @@ -108,14 +104,14 @@ public class Code02_RestoreWays { for (int s = 0; s < 3; s++) { if (arr[i] == 0 || v == arr[i]) { if (s == 0 || s == 1) { - for (int pre = 1; pre < 201; pre++) { - dp[i][v][s] += dp[i - 1][pre][pre < v ? 0 : (pre == v ? 1 : 2)]; - } - } else { - for (int pre = v; pre < 201; pre++) { - dp[i][v][s] += dp[i - 1][pre][pre < v ? 0 : (pre == v ? 1 : 2)]; + for (int pre = 1; pre < v; pre++) { + dp[i][v][s] += dp[i - 1][pre][0]; } } + dp[i][v][s] += dp[i - 1][v][1]; + for (int pre = v + 1; pre < 201; pre++) { + dp[i][v][s] += dp[i - 1][pre][2]; + } } } } @@ -143,11 +139,7 @@ public class Code02_RestoreWays { dp[0][v][1] = 1; } } - // presum[0~V][0] -> sum0[] - // presum[0~V][1] -> sum1[] - // presum[0~V][2] -> sum2[] int[][] presum = new int[201][3]; - // presum -> dp[0][..][..] 三张表 for (int v = 1; v < 201; v++) { for (int s = 0; s < 3; s++) { presum[v][s] = presum[v - 1][s] + dp[0][v][s]; @@ -158,14 +150,10 @@ public class Code02_RestoreWays { for (int s = 0; s < 3; s++) { if (arr[i] == 0 || v == arr[i]) { if (s == 0 || s == 1) { - // dp[i][..][..] -> dp[i-1][..][..] dp[i][v][s] += sum(1, v - 1, 0, presum); - dp[i][v][s] += dp[i - 1][v][1]; - dp[i][v][s] += sum(v + 1, 200, 2, presum); - } else { - dp[i][v][s] += dp[i - 1][v][1]; - dp[i][v][s] += sum(v + 1, 200, 2, presum); } + dp[i][v][s] += dp[i - 1][v][1]; + dp[i][v][s] += sum(v + 1, 200, 2, presum); } } } @@ -188,7 +176,7 @@ public class Code02_RestoreWays { // for test public static int[] generateRandomArray(int len) { - int[] ans = new int[(int) (Math.random() * len) + 2]; + int[] ans = new int[len]; for (int i = 0; i < ans.length; i++) { if (Math.random() < 0.5) { ans[i] = 0; @@ -209,11 +197,12 @@ public class Code02_RestoreWays { } public static void main(String[] args) { - int len = 3; - int testTime = 10; - System.out.println("test begin"); + int len = 4; + int testTime = 15; + System.out.println("功能测试开始"); for (int i = 0; i < testTime; i++) { - int[] arr = generateRandomArray(len); + int N = (int) (Math.random() * len) + 2; + int[] arr = generateRandomArray(N); int ans0 = ways0(arr); int ans1 = ways1(arr); int ans2 = ways2(arr); @@ -222,14 +211,14 @@ public class Code02_RestoreWays { System.out.println("Oops!"); } } - System.out.println("test finish"); - int[] arr = generateRandomArray(100000); - System.out.println(arr.length); + System.out.println("功能测试结束"); + System.out.println("==========="); + int N = 100000; + int[] arr = generateRandomArray(N); long begin = System.currentTimeMillis(); ways3(arr); long end = System.currentTimeMillis(); System.out.println("run time : " + (end - begin) + " ms"); - } }