大盜阿福 狀態機模型 2狀態

題目描述
阿福是一名經驗豐富的大盜。趁着月黑風高,阿福打算今晚洗劫一條街上的店鋪。

這條街上一共有 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章