POJ 1050 To the Max

来源:互联网 发布:电子打鼓软件下载 编辑:程序博客网 时间:2024/05/18 01:19

枚举 + dp, 化二维为一维, 第一次将2-n行分别加到第一行,第二次分别将3-n行加到第二行,再分别对单行求区间最大值。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAXN = 105;int n, temp[MAXN], a[MAXN][MAXN];inline int arrayMax(int *arr){int max = 0, dp = 0;for (int i = 0; i < n; i++)if (dp < 0)dp = arr[i];else{dp += arr[i];max = dp > max ? dp : max;}return max;}int main(){scanf("%d", &n);for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)scanf("%d", &a[i][j]);int maxAll = 0, maxOne = 0;for (int i = 0; i < n; i++){memset(temp, 0, sizeof(temp));for (int j = i; j < n; j++){for (int k = 0; k < n; k++)temp[k] += a[j][k];maxOne = arrayMax(temp);maxAll = maxOne > maxAll ? maxOne : maxAll;}}printf("%d\n", maxAll);}


0 0
原创粉丝点击