@@ -10,19 +10,17 @@ static inline int max(int a, int b)
1010static int _rob (int * nums , int numsSize )
1111{
1212 int i ;
13- int * * money = malloc ((numsSize + 1 ) * sizeof (int * ));
14- for (i = 0 ; i < numsSize + 1 ; i ++ ) {
15- money [i ] = malloc (2 * sizeof (int ));
16- memset (money [i ], 0 , 2 * sizeof (int ));
13+ int taken = nums [0 ];
14+ int untaken = 0 ;
15+ /* Record max profits of nums[0...i] respectively */
16+ for (i = 1 ; i < numsSize ; i ++ ) {
17+ int tmp_taken = taken ;
18+ int tmp_untaken = untaken ;
19+ taken = tmp_untaken + nums [i ];
20+ untaken = max (tmp_taken , tmp_untaken );
1721 }
1822
19- for (i = 1 ; i <= numsSize ; i ++ ) {
20- int cash = nums [i - 1 ];
21- money [i ][0 ] = max (money [i - 1 ][0 ], money [i - 1 ][1 ]);
22- money [i ][1 ] = money [i - 1 ][0 ] + cash ;
23- }
24-
25- return max (money [numsSize ][0 ], money [numsSize ][1 ]);
23+ return max (taken , untaken );
2624}
2725
2826static int rob (int * nums , int numsSize )
@@ -32,6 +30,7 @@ static int rob(int* nums, int numsSize)
3230 } else if (numsSize == 1 ) {
3331 return nums [0 ];
3432 } else {
33+ /* The first and the last element are adjacent */
3534 return max (_rob (nums + 1 , numsSize - 1 ), _rob (nums , numsSize - 1 ));
3635 }
3736}
0 commit comments