LeetCode java day8
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
class Solution {
public int rob(int[] nums) {
int[] dp=new int[100];
dp[0]=nums[0];
int len=nums.length;
for (int i = 1; i < len ; i++) {
if(i==1){
dp[i]=Math.max(nums[1],nums[0]);
}
else {
dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i]);
}
}
return dp[len-1];
}
}
感觉动态规划就很玄学。。。
有时候状态转移方程完全靠前三个数据写出来,然后就懵了。
数组的每个下标作为一个阶梯,第 i
个阶梯对应着一个非负数的体力花费值 cost[i]
(下标从 0
开始)。
每当爬上一个阶梯都要花费对应的体力值,一旦支付了相应的体力值,就可以选择向上爬一个阶梯或者爬两个阶梯。
请找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。
class Solution {
static int max=1001;
int []dp=new int[max];
public int minCostClimbingStairs(int[] cost) {
dp[0]=dp[1]=0;
for (int i = 2; i <=cost.length; i++) {
dp[i]=Math.min((cost[i-1]+dp[i-1]),(cost[i-2]+dp[i-2]));
}
return dp[cost.length];
}
}
确实使用动态规划还不错,但是由于题目原因,一开始容器过于庞大,所以咱可以初始化容器,直接一个劲往上走。
class Solution {
public int minCostClimbingStairs(int[] cost) {
if(cost.length<2){
return 0;
}
int dp1=0;
int dp2=0;
for (int i = 2; i <=cost.length; i++) {
int next=Math.min((dp1+cost[i-1]),(dp2+cost[i-2]));
dp2=dp1;
dp1=next;
}
return dp1;
}
}
坚持就完了,写完力扣还得把这周学的树和图处理一下—