小米OJ #85 搶劫!【動態規劃】
阿新 • • 發佈:2018-12-12
描述
你是一名專業劫匪,並且正在計劃搶劫一條街道上的所有房子。每個房子有一定數量的現金。 唯一能夠阻止你的就是安保系統被觸發,當有兩個相鄰的房子在同一晚被劫時,安保系統才會自動觸發。 現在給你一個正整數陣列表示每家現金數,請求出這一晚你能在不觸發安保系統時搶到的最大金額。
輸入
由逗號(,)分隔的一串正整數,表示這一條街上每個房子內的現金數。
輸出
一個正整數,表示你能搶到的最大金額。
輸入樣例
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; }