本文主要是介绍偷金子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
偷金子:
思路:画出状态树,左边是偷,右边是不偷。左边偷两个的时候,右边那个不能偷。画出来之后,用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];}
这篇关于偷金子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!