動態規劃, dp[i][j] = max(dp[i - 1][j], dp[i][j - 1], dp[i][j / k])
#include <stdio.h>
#define MAX 1005
#define INF -0xffffff
#define max(a, b) (a > b ? a : b)
int dp[21][MAX];
int map[21][MAX];
int n, m;
int main() {
int T;
int i, j;
int k;
while (scanf("%d", &T) != EOF) {
while (T--) {
scanf("%d%d", &n, &m);
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; j++) {
scanf("%d", &map[i][j]);
}
}
for (i = 0; i <= n; i++) {
dp[i][0] = INF;
}
for (j = 0; j <= m; j++) {
dp[0][j] = INF;
}
dp[0][1] = dp[1][0] = 0;
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; j++) {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + map[i][j];
for (k = 2; j / k > 0; k++) {
if (j % k == 0) {
dp[i][j] = max(dp[i][j], dp[i][j / k] + map[i][j]);
}
}
}
}
printf("%d\n", dp[n][m]);
}
}
return 0;
}