狀態機模型 AcWing 1049. 大盜阿福
阿新 • • 發佈:2022-06-01
題目連結
思路
- 設定狀態\(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; }