求一个矩阵的子矩阵最大和。
这道题的基础是最大子段和。
给一个序列,求最大子序和
动态规划子状态
当(d[i-1]>0) d[i]=d[i-1]+a[i];
否则 d[i]=a[i];
int Maxarry(int a[],int n){ //最大子段和 int m=-INF; int tmp=-1; for(int i=0;i<n;i++) { if(tmp>0){ tmp+=a[i]; } else tmp=a[i]; if(tmp>m) m=tmp; } return m; }
本题在此基础上求矩阵和,用三个循环
如果最优解左起第i列,右止于第j列,那么我们相当于把这些列的对应位加和,成为一列,并对改列求最大子段和即可(降维思想)。
/*最大矩阵和*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
const int N=102;
int d[N][