你正在玩一个游戏。游戏中有一排房屋,最开始的时候都是没有上锁的,每间房存有一定数量金币。 但是这些房子里装了联通装置,一旦拿取了某间房子的金币,相邻的两间房屋就会自动锁死,锁死的房间不能拿取金币。 你可以进行多次拿取金币的操作,求游戏结束后,最多能获得多少金币。 input: 2行 第1行1个整数n代表数组长度, 第2行n个正整数,代表每间房的现金数量,用空格隔开 (0
#include <stdio.h>
#include <stdlib.h>
int rob(int *nums, int numsSize)
{
if(numsSize == 0)
{
return 0;
}
else if(numsSize == 1)
{
return nums[0];
}
else if(numsSize == 2)
{
return fmax(nums[0],nums[1]);
}
int dp1 = nums[0];
int dp2 = fmax(nums[0],nums[1]);
int sum = 0;
for(int i = 2;i < numsSize;i++)
{
sum = fmax(nums[i] + dp1,dp2);
dp1 = dp2;
dp2 = sum;
}
return sum;
}
int main()
{
int i,n,a[21];
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
printf("%d",rob(a,n));
return 0;
}
写全一点
是相邻的两间 左边两间 右边两间吗
7+9是16阿...这题目语文有待提高。。
(2条消息) leetcode198打家劫舍java题解(动态规划)_老简单题-CSDN博客
看看这个
用这个
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.empty())
return 0;
int n=nums.size();
vector<int> dp(n+1,0);
dp[1]=nums[0];
for(int i=2;i<=n;++i)
dp[i]=max(dp[i-1],dp[i-2]+nums[i-1]);
return dp[n];
}
};
LeetCode—198.打家劫舍(House Robber)——分析及代码(C++)_江南土豆的博客-CSDN博客
问题接续: (0
(0
output: 1个整型的结果,表示最多能够获得的金币数量(不会超过int整型范围) 提示:这个游戏是一个策略性问题,尽管每次选择的时候影响相邻的房间,但是可以你从前往后顺序地处理,即当前决策第i号房间是否拿取金币的时候,第i号房间的决策只依赖于在i号房间前面的那些房间的决策情况。 你可以使用一个数组A,A[i]表示决策完前i号房间后所获得的最大金币数量, 因为每次决策都可以选择拿取当前房间的金币或者丢弃该房间, 所以可以看到A[i]的值只和A[i-1],A[i-2] 以及当前房间的金币数量有关。 Samples: input: 5 2 7 4 6 9 output: 16
也许对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html