一、房子是直线
解法1 、不用动态规划解法,用递归:
这道题就是求数组的下标不能连续 而且求最大和 。 不能用贪心算法哦,因为如[1,2,3]你不能取1的时候局要看2,取2的时候看和3哪个大,那么就很难取到。
用递归解:
思路:
看i-2 和i-1的情况。如果i-2 > i-1 那么就取i 。
如果i-2+i<i-1那么就取i-1,而不能取i了。
那么就是取 i-1 或者 i-2+i的
public static void main(String[] args) {
int[] array=new int[]{
2,7,1,2,9};
System.out.println(maxMoney(array, array.length - 1));
}
//这里的index就是传入数组的下标 ,一开始传入数组长度-1
public static int maxMoney(int[] array,int index){
if (array ==null || index<0){
return 0;
}
//只有一个元素了 递归终止条件
if (index==0){
return array[0];
}
//见上面的思路
return Math.max(maxMoney(array,index-1),maxMoney(array,index-2)+array[index]);
}
但是递归的复杂度在与 return 那里 遍历多少次,这里主要是maxMoney一个就是On,return里面有两个,那么就是O2n还是On。,空间复杂度也蛮高的(空间复杂度还跟它的参数有关)
空间复杂度:https://blog.csdn.net/youngyangyang04/article/details/106313759
解法2、动态规划
由于上面递归 存在了很多重复的计算(重叠子问题),所以我们得定义dp数组把它保存起来
dp数组的定义以为还是二维,得看你递归的时候的影响因子个数哦。
public static void main(String[] args) {
int[]