思路很清晰,就是调了很长时间。
找k的因数的时候,循环终止条件是到k-1。
我不知道为什么写成了sqrt(k)。想不起来为什么这么写。
附代码。
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> int map[30][2000]; int dp[30][2000]; int max(int a, int b) { return a > b ? a : b; } int main() { int C; int n, m; int i, j; int k; int temp; scanf("%d", &C); while (C--) { scanf("%d %d", &n, &m); memset(dp, 0, sizeof(dp)); memset(map, 0, sizeof(map)); for (i = 1; i <= n; i++) { for (j = 1; j <= m; j++) scanf("%d", &map[i][j]); } // the first column dp[1][1] = map[1][1]; for (i = 2; i <= n; i++) dp[i][1] = dp[i - 1][1] + map[i][1]; for (i = 1; i <= n; i++) { for (j = 2; j <= m; j++) { temp = dp[i][j - 1]; for (k = 1; k < j; k++) { if (0 == j%k) temp = max(dp[i][k], temp); } if (i >= 2) temp = max(temp, dp[i - 1][j]); dp[i][j] = temp + map[i][j]; } } printf("%d\n", dp[n][m]); } return 0; }