1. 程式人生 > 其它 >狀態機模型 AcWing 1049. 大盜阿福

狀態機模型 AcWing 1049. 大盜阿福

題目連結

大盜阿福

思路

  • 設定狀態\(f[i]\)表示前\(i\)家店鋪所能夠拿到的最多金額,最後\(f[n-1]\)\(f[n]\)取最大值即可
  • 狀態轉移:因為不能相鄰,所以\(f[i]\)\(f[i-2]\)相關,同時也和\(f[i-1]\)去掉第\(i-1\)家店鋪金額相關,也是取大值

程式碼

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 100005;
int n,a[maxn],f[maxn];
int main() {
    #ifdef ONLINE_JUDGE
    #else
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif // ONLINE_JUDGE
    int T;
    cin >> T;
    while(T--) {
        memset(a,0,sizeof(a));
        memset(f,0,sizeof(f));
        cin >> n;
        for(int i = 1; i <= n; ++i) cin >> a[i];
        f[1] = a[1];
        f[2] = max(a[1], a[2]);
        for(int i = 3; i <= n; ++i) {
            f[i] = max(f[i - 1] - a[i - 1], f[i - 2]) + a[i];
        }
        int res = max(f[n], f[n - 1]);
        cout << res << endl;
    }
    return 0;
}