状态机 状态转移
贪心
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
int f[N] , w[N];
int main() {
int T , n;
cin >> T;
while (T -- ) {
cin >> n;
for (int i = 1 ; i <= n ; i ++ ) cin >> w[i];
f[1] = w[1];
int res = 0;
for (int i = 2 ; i <= n ; i ++ ) {
f[i] = max(f[i - 1] , f[i - 2] + w[i]); // 取每一个前后两项最大的差值
res = max(f[i] ,res);
}
cout << res << endl;
}
return 0;
}
状态机
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 100010;
int f[N][2];
int w[N];
int main() {
int T , n;
cin >> T;
while (T -- ) {
memset(f,-0x3f,sizeof f); // 表示还没有进行决策,求最大值,所有所有选项不可选的状态为最小值
cin >> n;
for (int i = 1 ; i <= n ; i ++ ) cin >> w[i];
f[1][1] = w[1] , f[1][0] = 0; // 初始化第一个状态,开始状态转移
for (int i = 2 ; i <= n ; i ++ ) {
f[i][0] = max(f[i - 1][1] , f[i - 1][0]);
f[i][1] = max(f[i - 2][1] + w[i] , f[i - 1][0] + w[i]);
}
cout << max(f[n][1] , f[n][0]) << endl;
}
return 0;
}