1 3 8 9 10 10 10 10 -10 10 10 10 -11 -1 0 2 11 10 -20 -11 -11 10 11 2 10 -10 -10 Sample Output 52
AC代码:
#include <iostream>#include <algorithm>#include <cstdio>#include <cmath>#include <cstring>using namespace std;int a[30][1010];int b[30][1010];int main(){ int C; cin >> C; while (C--) { int n, m, i, j ,k; cin >> n >> m; memset (a, 0, sizeof(a)); memset (b, 0, sizeof(b)); for (i = 1; i <= n; i++) for (j = 1;j <= m; j++) scanf("%d%*c", &a[i][j]); for (i = 1; i<=n; i++) for (j = 1; j <= m; j++) { if (i != 1 && j != 1) b[i][j] = a[i][j] + max(b[i-1][j],b[i][j-1]); else if (i == 1 && j == 1) b[i][j] = a[i][j]; else if (i == 1) b[i][j] = a[i][j] + b[i][j-1]; else b[i][j] = a[i][j] + b[i-1][j]; for (k = 1; k < j; k++) if (j % k == 0) b[i][j] = max (b[i][j],b[i][k] + a[i][j]); } cout << b[n][m] <<endl; } return 0;}**这是一道简单的DP题,但是一开始未注意到负数的情况,未做处理, 若用初值处理易溢出,用if限制边界即可**。
新闻热点
疑难解答