198. House Robber

题来自leetcode

题目:

你是一个职业强盗,打算抢劫街上的房子。每个房子都有一定量的存款,唯一的约束阻止你抢它们是相邻的房屋有安全系统连接,它会自动与警方联系,即两个相邻的房屋不能在同一个晚上被偷。给出一个非负数的整数表,代表每个房子的钱数,确定今晚你可以抢劫的最大金额而不报警

思考:

假设已经知道0, 1,2,3,n-1个房屋的偷取方式能获得最大金钱,dp(k) 0<=k<=n-1

那么在房屋数增加到n时,dp(n)如何用dp(k)来表示?

0-n-1是已知,那么在偷取第n个时

1. n不被偷取  dp(n) = dp(n-1)

2. n被偷取,那么n-1一定没被偷取 dp(n) = dp(n-2) + M(n)

所以状态方程为

dp(n) = max(dp(n-1), dp(n-2) + M(n))

代码:

#define max(a, b) ((a)>(b)?(a):(b))
int rob(int num[], int n) {
    int a; //prev prev max value
    int b; //prev max value
    int c; //current max value;
    int i;
    
    if (n == 0) {
        return 0;
    }
    
    if (n == 1) {
        return num[0];
    }
    
    a = 0;
    b = num[0];
    c = 0;
    
    for (i = 1; i < n; i++) {
        c = max(b, a + num[i]);
        a = b;
        b = c;
    }
    
    return c;
}

这个题其实类似于背包问题,背包问题是二维的,有两个变量,这个问题是一维的,只有一个变量!

你可能感兴趣的:(动态规划)