基本思想:
隐藏下的最大连续数和的问题,不容易看出来,从矩阵的性质中才可能看出来。
自己最初是想用二维DP来标识0-x,0-y的矩阵,但是发现不能表示非0起点的最大矩阵和;
一些大佬的思想是通过多行合并来计算,例如1-3行合并,则是找3*n的最大子矩阵,可以通过一次最长连续和求解,这个第一次见;
关键点:
无;
#include<iostream> #include<vector> #include<algorithm> #include<string> using namespace std; const int maxn = 108; int n; int ma[maxn][maxn]; int dp[maxn]; int buf[maxn]; int Max = -129; void findMax() { dp[0] = buf[0]; for (int i = 1; i < n; i++) { if (buf[i] + dp[i - 1] > buf[i]) { dp[i] = buf[i] + dp[i - 1]; } else { dp[i] = buf[i]; } } sort(dp, dp + n); if (Max < dp[n - 1]) Max = dp[n - 1]; } int main() { while (cin >> n) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> ma[i][j]; } } for (int k = 0; k < n; k++) { for (int v = 0; v < n; v++) { buf[v] = ma[k][v]; } findMax(); for (int i = k+1; i < n; i++) { for (int j = 0; j < n; j++) { buf[j] += ma[i][j]; } findMax(); } } cout << Max << endl; } }