偷金子

来源:互联网 发布:warframe离线数据模块 编辑:程序博客网 时间:2024/06/10 17:21

偷金子:


思路:画出状态树,左边是偷,右边是不偷。左边偷两个的时候,右边那个不能偷。画出来之后,用f(0,4) f(1,3) 来表示,前面一个参数的物理意义是:前面投了几个,后面一个参数的物理意义是:后面还剩下多少个。注意,前面的参数只有3种情况,偷0个,偷1个,偷2个。有两个变量,所以dp是二维的数组。


public int stole(int[] array) {int[][] dp = new int[3][array.length+1];for(int i=0; i<dp.length; i++){for(int j=0; j<dp[0].length;j++){dp[i][j] = -1;}}     calculate(array, dp, 0, array.length);     return dp[0][array.length];}public int calculate(int[] array, int[][] dp, int front, int remaining){if(remaining == 0) return 0;if(dp[front][remaining] != -1 ) return dp[front][remaining];int left = -1;if(front < 2) {left = array[array.length-remaining] + calculate(array, dp, front+1, remaining -1);}int right = calculate(array, dp, 0, remaining-1);dp[front][remaining] = Math.max(left, right);return dp[front][remaining];}


0 0
原创粉丝点击