M×N 矩陣,每格有一顆豆子,值為品質值。吃掉 (x, y) 後,不能吃 (x, y-1), (x, y+1)(同行相鄰),也不能吃 x-1 行和 x+1 行的所有豆子。求最大總品質。M×N ≤ 200,000。
dp[i][0] 不吃第 i 格,dp[i][1] 吃第 i 格dp[i][0] = max(dp[i-1][0], dp[i-1][1])dp[i][1] = dp[i-1][0] + val[i]max(dp[N][0], dp[N][1])
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 200005;
int dp0[MAXN], dp1[MAXN], val[MAXN], row_max[MAXN];
int solve_row(int *a, int len) {
dp1[1] = a[1]; dp0[1] = 0;
for (int i = 2; i <= len; i++) {
dp1[i] = dp0[i-1] + a[i];
dp0[i] = max(dp0[i-1], dp1[i-1]);
}
return max(dp0[len], dp1[len]);
}
int main() {
int M, N;
while (~scanf("%d%d", &M, &N)) {
for (int i = 1; i <= M; i++) {
for (int j = 1; j <= N; j++) scanf("%d", &val[j]);
row_max[i] = solve_row(val, N);
}
printf("%d\n", solve_row(row_max, M));
}
return 0;
}
O(N) 每行,共 M 行 → O(MN)O(M)O(MN),MN ≤ 200,000 極快O(max(M,N))O(1) 可優化