动态规划与递归
-
有一个楼梯 总共有n个台阶 每次 可以上一个台阶 也可以两个台阶 问 爬上这样的一个楼梯 一共有多少种不同的方法
递归+记忆化搜索
package com.zyk; public class ClimbStairs { public static int climbStairs(int n){ int[] memo=new int[n+1]; for (int i = 0; i <n+1 ; i++) { memo[i]=-1; } if(n==1) return 1; if(n==2) return 2; if(memo[n]==-1){ memo[n]=climbStairs(n-1)+climbStairs(n-2); } return memo[n]; } public static void main(String[] args) { int res = climbStairs(5); System.out.println(res); } }
动态规划
package com.zyk; public class ClimbStairs { public static int climbStairs(int n){ int[] dp=new int[n+1]; dp[0]=1;dp[1]=1; for (int i = 2; i <=n ; i++) { dp[i]=dp[i-1]+dp[i-2]; } return dp[n]; } public static void main(String[] args) { int res = climbStairs(5); System.out.println(res); } }
-
给定一个整数n 可以将其分割成多个数字的和 若要让这些数字的乘积最大 求分割的方法 (至少分成两个数) 算法返回这个最大的乘积
递归
package com.zyk; public class IntegerBreak { public static int max3(int a,int b,int c){ int max1=Math.max(a,b); int max=Math.max(max1,c); return max; } public static int breakInteger(int n){ int res=-1; if(n==1) return 1; for (int i = 1; i <=n-1 ; i++) { res=max3(res,i*breakInteger(n-i),i*(n-i)); } return res; } public static void main(String[] args) { int res = breakInteger(10); System.out.println(res); } }
递归+记忆化搜索
package com.zyk;
public class IntegerBreak {
public static int max3(int a,int b,int c){
int max1=Math.max(a,b);
int max=Math.max(max1,c);
return max;
}
public static int breakInteger(int n){
int[] memo=new int[n+1];
for (int i = 0; i <n+1 ; i++) {
memo[i]=-1;
}
if(n==1)
return 1;
if(memo[n]==-1){
for (int i = 1; i <=n-1 ; i++) {
memo[n]=max3(memo[n],i*breakInteger(n-i),i*(n-i));
}
}
return memo[n];
}
public static void main(String[] args) {
int res = breakInteger(10);
System.out.println(res);
}
}
动态规划
package com.zyk;
public class IntegerBreak {
public static int max3(int a,int b,int c){
int max1=Math.max(a,b);
int max=Math.max(max1,c);
return max;
}
public static int breakInteger(int n){
int[] dp=new int[n+1];
dp[1]=1;
for (int i = 2; i <=n ; i++) {
for (int j = 1; j <=i-1; j++) {
dp[i]=max3(dp[i],dp[j]*(i-j),j*(i-j));
}
}
return dp[n];
}
public static void main(String[] args) {
int res = breakInteger(10);
System.out.println(res);
}
}
-
你是一个专业的小偷 打算洗劫一条街的所有房子 每一个房子里都有价值不同的宝物 但是 如果连续偷窃两栋房子 就会触发报警系统 编程求出最多可以偷窃价值多少的宝物
如 [3,4,1,2] 则返回6 [3,(4),1,(2)]
递归
package com.zyk; import java.util.ArrayList; public class HouseRobber { public static int houseRobber(ArrayList<Integer> list,int index){ if (index>=list.size()) return 0; int res=0; for (int i = index; i <=list.size()-1 ; i++) { res=Math.max(res,list.get(i)+houseRobber(list,i+2)); } return res; } public static void main(String[] args) { //int[] arr={3,4,1,2}; int[] arr={4,1,3,2,5}; ArrayList<Integer> list=new ArrayList<>(); for (int i = 0; i <arr.length ; i++) { list.add(arr[i]); } int res = houseRobber(list, 0); System.out.println(res); } }
递归+记忆化搜索
package com.zyk; import java.util.ArrayList; public class HouseRobber { public static int houseRobber(ArrayList<Integer> list,int index){ int n=list.size(); int[] memo=new int[n+1]; for (int i = 0; i <n+1 ; i++) { memo[i]=-1; } if (index>=list.size()) return 0; if(memo[index]==-1){ for (int i = index; i <=list.size()-1 ; i++) { memo[index]=Math.max(memo[index],list.get(i)+houseRobber(list,i+2)); } } return memo[index]; } public static void main(String[] args) { int[] arr={3,4,1,2}; //int[] arr={4,1,3,2,5}; ArrayList<Integer> list=new ArrayList<>(); for (int i = 0; i <arr.length ; i++) { list.add(arr[i]); } int res = houseRobber(list, 0); System.out.println(res); }
动态规划
package com.zyk; import java.util.ArrayList; public class HouseRobber { public static int houseRobber(ArrayList<Integer> list){ int n=list.size(); if(n==0) return 0; int[] dp=new int[n]; for (int i = 0; i <n ; i++) { dp[i]=-1; } dp[n-1]=list.get(n-1); for (int i = n-2; i>=0 ; i--) { for (int j = i; j <n ; j++) { dp[i]=Math.max( dp[i] , list.get(j)+(j+2<n?dp[j+2]:0)); } } return dp[0]; } public static void main(String[] args) { //int[] arr={3,4,1,2}; int[] arr={4,1,3,2,5}; ArrayList<Integer> list=new ArrayList<>(); for (int i = 0; i <arr.length ; i++) { list.add(arr[i]); } int res = houseRobber(list); System.out.println(res); } }