线性 dp 中比较经典的一道题,挺简单的。
既然只能往下或者往右走,那么每个点的最优情况就是 $f_{i-1,j}$ 或者是 $f_{i,j-1}$。
如果你到了一个点,那肯定摘了会更优啦。于是动态转移方程就可以推出为
$f_{i,j} = max\ (f_{i-1,j},\ f_{i,j-1}) + a_{i,j}$。
时间复杂度为 O(TRC),空间复杂度为 O(RC)。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e2 + 5;
int T, n, m, f[N][N];
inline void solve() {
memset (f, 0, sizeof f);//清空数组,虽然在此题也没啥影响但是个好习惯。
cin >> n >> m;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++) {
int a; cin >> a;
f[i][j] = max (f[i - 1][j], f[i][j - 1]) + a;//动态转移方程
}
cout << f[n][m] << endl;
}
signed main() {
cin >> T;
while (T --) solve();
}