简单的十来行C语言(直接给oj作业代码余额采纳)

你正在玩一个游戏。游戏中有一排房屋,最开始的时候都是没有上锁的,每间房存有一定数量金币。 但是这些房子里装了联通装置,一旦拿取了某间房子的金币,相邻的两间房屋就会自动锁死,锁死的房间不能拿取金币。 你可以进行多次拿取金币的操作,求游戏结束后,最多能获得多少金币。 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