1. 程式人生 > >小米OJ #85 搶劫!【動態規劃】

小米OJ #85 搶劫!【動態規劃】

描述

你是一名專業劫匪,並且正在計劃搶劫一條街道上的所有房子。每個房子有一定數量的現金。 唯一能夠阻止你的就是安保系統被觸發,當有兩個相鄰的房子在同一晚被劫時,安保系統才會自動觸發。 現在給你一個正整數陣列表示每家現金數,請求出這一晚你能在不觸發安保系統時搶到的最大金額。

輸入

由逗號(,)分隔的一串正整數,表示這一條街上每個房子內的現金數。

輸出

一個正整數,表示你能搶到的最大金額。

輸入樣例

1,2

輸出樣例

2

題解:F[i] 表示到第 i 間房子的時候所搶到的最大金額。很明顯,對於每間房子都有兩種選擇,即搶或者不搶,容易得遞推式為:F[i] = max(F[i-2]+a[i], F[i-1])。

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int a[1000000], f[1000000];
int main()
{
    char line[1000001];

    while (cin.getline(line, 1000000)) {
        int id = 0, x;
        char *p = strtok(line, ",");
        while(p){
            sscanf(p, "%d", &x);
            a[id++] = x;
            p = strtok(NULL, ",");
        }
        int ans = 0 ;
        f[0] = a[0], f[1] = max(a[0], a[1]);
        for(int i = 2; i < id; i++){
            f[i] = max(f[i-2]+a[i], f[i-1]);
        }
        cout << f[id-1] <<endl;
    }
    return 0;
}