琢磨这个题琢磨了一下午,看了网上好多的代码都没写注释,也没看懂,最后找到了一个写的很清楚的
总体来说这个题求矩阵的dp,思路就是在每次循环中将每列叠加起来形成一个1行n列的数组,在对这个数组求最大连续值。获得结果更新最大值。现在结合代码说一下:
//
// main.cpp
// POJ1050
//
// Created by dan on 16/9/17.
// Copyright © 2016年 dan. All rights reserved.
//
#include <iostream>
#include <string.h>
#include <string>
#include <stdio.h>
using namespace std;
#define MAXN 1000
int a[MAXN][MAXN];
int b[MAXN];
//这个是求一维数组最大连续值的函数,注意的是每次判定的是当前的sum值,而不是b[i]值。
int getMax(int n){
int nmax = -999;
int sum = 0;
for (int i = 0; i < n; i++)
{
if (sum > 0)
sum += b[i];
else
sum = b[i];
nmax = max(nmax, sum);
}
return nmax;
}
int dp(int n){
int ans = 0;
for (int i = 0; i < n; i++){
memset(b, 0, sizeof(b));
for (int j = i; j < n; j++){
//i表示行的循环,j代表从第i行开始,向下进行合并。
//比如n == 4, i == 0时。j从范围[0,3],将每一行的值
//放进数组b中,b[k]代表第j行k列所有元素的和。
//之后对b求最大连续数字和,更新结果。
for(int k = 0; k < n; k++){
b[k] += a[j][k];
}
ans = max(ans, getMax(n));
}
}
return ans;
}
int main(int argc, const char * argv[]) {
int n;
while(cin >> n){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cin >>a[i][j];
}
}
cout << dp(n) << endl;;
}
}