題目描述
阿福是一名經驗豐富的大盜。趁着月黑風高,阿福打算今晚洗劫一條街上的店鋪。
這條街上一共有 N 家店鋪,每家店中都有一些現金。
阿福事先調查得知,只有當他同時洗劫了兩家相鄰的店鋪時,街上的報警系統纔會啓動,然後警察就會蜂擁而至。
作爲一向謹慎作案的大盜,阿福不願意冒着被警察追捕的風險行竊。
他想知道,在不驚動警察的情況下,他今晚最多可以得到多少現金?
輸入格式
輸入的第一行是一個整數 T,表示一共有 T 組數據。
接下來的每組數據,第一行是一個整數 N ,表示一共有 N 家店鋪。
第二行是 N 個被空格分開的正整數,表示每一家店鋪中的現金數量。
每家店鋪中的現金數量均不超過1000。
輸出格式
對於每組數據,輸出一行。
該行包含一個整數,表示阿福在不驚動警察的情況下可以得到的現金數量。
數據範圍
1≤T≤50,
1≤N≤105
輸入樣例:
2
3
1 8 2
4
10 7 6 14
輸出樣例:
8
24
樣例解釋
對於第一組樣例,阿福選擇第2家店鋪行竊,獲得的現金數量爲8。
對於第二組樣例,阿福選擇第1和4家店鋪行竊,獲得的現金數量爲10+14=24。
思路:
- 用狀態1代表搶劫當前的店鋪, 0代表不搶, f[i, 0], f[i, 1]表示當前的兩個狀態
- 由於不可以搶劫兩個連續的店鋪, 所以纔在3個狀態轉換, 0 --> 1, 0–>0, 1 --> 0,
代碼
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N = 100010;
int f[N][2];
int t, n;
int main()
{
cin >>t;
while(t--)
{
memset(f, 0, sizeof 0);
f[0][0];
f[0][1] = -0x3f3f3f3f;
cin >>n;
for(int i = 1; i <= n; i++)
{
int a;
cin >> a;
f[i][0] = max(f[i - 1][0], f[i - 1][1]);
f[i][1] = (f[i - 1][0] + a);
}
cout << max(f[n][0], f[n][1]) << endl;
}
return 0;
}