@@ -90,10 +90,6 @@ public static int process1(int[] arr, int i, int v, int s) {
9090public static int ways2 (int [] arr ) {
9191int N = arr .length ;
9292int [][][] dp = new int [N ][201 ][3 ];
93- // dp[0][...][...]
94- // dp[0][...][2] = 0
95- // dp[0][...][0] = 1
96- // dp[0][...][1] = 1
9793if (arr [0 ] != 0 ) {
9894dp [0 ][arr [0 ]][0 ] = 1 ;
9995dp [0 ][arr [0 ]][1 ] = 1 ;
@@ -108,14 +104,14 @@ public static int ways2(int[] arr) {
108104for (int s = 0 ; s < 3 ; s ++) {
109105if (arr [i ] == 0 || v == arr [i ]) {
110106if (s == 0 || s == 1 ) {
111- for (int pre = 1 ; pre < 201 ; pre ++) {
112- dp [i ][v ][s ] += dp [i - 1 ][pre ][pre < v ? 0 : (pre == v ? 1 : 2 )];
113- }
114- } else {
115- for (int pre = v ; pre < 201 ; pre ++) {
116- dp [i ][v ][s ] += dp [i - 1 ][pre ][pre < v ? 0 : (pre == v ? 1 : 2 )];
107+ for (int pre = 1 ; pre < v ; pre ++) {
108+ dp [i ][v ][s ] += dp [i - 1 ][pre ][0 ];
117109}
118110}
111+ dp [i ][v ][s ] += dp [i - 1 ][v ][1 ];
112+ for (int pre = v + 1 ; pre < 201 ; pre ++) {
113+ dp [i ][v ][s ] += dp [i - 1 ][pre ][2 ];
114+ }
119115}
120116}
121117}
@@ -143,11 +139,7 @@ public static int ways3(int[] arr) {
143139dp [0 ][v ][1 ] = 1 ;
144140}
145141}
146- // presum[0~V][0] -> sum0[]
147- // presum[0~V][1] -> sum1[]
148- // presum[0~V][2] -> sum2[]
149142int [][] presum = new int [201 ][3 ];
150- // presum -> dp[0][..][..] 三张表
151143for (int v = 1 ; v < 201 ; v ++) {
152144for (int s = 0 ; s < 3 ; s ++) {
153145presum [v ][s ] = presum [v - 1 ][s ] + dp [0 ][v ][s ];
@@ -158,14 +150,10 @@ public static int ways3(int[] arr) {
158150for (int s = 0 ; s < 3 ; s ++) {
159151if (arr [i ] == 0 || v == arr [i ]) {
160152if (s == 0 || s == 1 ) {
161- // dp[i][..][..] -> dp[i-1][..][..]
162153dp [i ][v ][s ] += sum (1 , v - 1 , 0 , presum );
163- dp [i ][v ][s ] += dp [i - 1 ][v ][1 ];
164- dp [i ][v ][s ] += sum (v + 1 , 200 , 2 , presum );
165- } else {
166- dp [i ][v ][s ] += dp [i - 1 ][v ][1 ];
167- dp [i ][v ][s ] += sum (v + 1 , 200 , 2 , presum );
168154}
155+ dp [i ][v ][s ] += dp [i - 1 ][v ][1 ];
156+ dp [i ][v ][s ] += sum (v + 1 , 200 , 2 , presum );
169157}
170158}
171159}
@@ -188,7 +176,7 @@ public static int sum(int begin, int end, int relation, int[][] presum) {
188176
189177// for test
190178public static int [] generateRandomArray (int len ) {
191- int [] ans = new int [( int ) ( Math . random () * len ) + 2 ];
179+ int [] ans = new int [len ];
192180for (int i = 0 ; i < ans .length ; i ++) {
193181if (Math .random () < 0.5 ) {
194182ans [i ] = 0 ;
@@ -209,11 +197,12 @@ public static void printArray(int[] arr) {
209197}
210198
211199public static void main (String [] args ) {
212- int len = 3 ;
213- int testTime = 10 ;
214- System .out .println ("test begin " );
200+ int len = 4 ;
201+ int testTime = 15 ;
202+ System .out .println ("功能测试开始 " );
215203for (int i = 0 ; i < testTime ; i ++) {
216- int [] arr = generateRandomArray (len );
204+ int N = (int ) (Math .random () * len ) + 2 ;
205+ int [] arr = generateRandomArray (N );
217206int ans0 = ways0 (arr );
218207int ans1 = ways1 (arr );
219208int ans2 = ways2 (arr );
@@ -222,14 +211,14 @@ public static void main(String[] args) {
222211System .out .println ("Oops!" );
223212}
224213}
225- System .out .println ("test finish" );
226- int [] arr = generateRandomArray (100000 );
227- System .out .println (arr .length );
214+ System .out .println ("功能测试结束" );
215+ System .out .println ("===========" );
216+ int N = 100000 ;
217+ int [] arr = generateRandomArray (N );
228218long begin = System .currentTimeMillis ();
229219ways3 (arr );
230220long end = System .currentTimeMillis ();
231221System .out .println ("run time : " + (end - begin ) + " ms" );
232-
233222}
234223
235224}
0 commit comments