题意:给你一个n*n的矩阵,求其中子矩阵的最大和是多少。
思路:枚举子矩阵的宽度,然后将该宽度的矩阵转换为一个一维数组,接着就是我们熟悉的最大连续和了。
#include <iostream>
#include <climits>
using namespace std;
int a[200][200];
int b[200];
int dp[200];
int n;
int input(){
if(cin>>n){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++)
cin>>a[i][j];
}
return 1;
}
else
return 0;
}
int solve(){
int maximum = INT_MIN;
for(int i = 0; i < n; i++){
for(int j = i; j < n; j++){
for(int k = 0; k < n; k++){//将矩阵构造成一维的数组
b[k] = 0;
for(int l = i; l <= j; l++)
b[k] += a[k][l];
dp[k] = b[k];
}
for(int k = 1; k < n; k++){//求最大连续和
if(dp[k-1] + b[k] > dp[k]){
dp[k] = dp[k-1]+b[k];
}
}
for(int k = 0; k < n; k++)//更新最大值
if(dp[k] > maximum)
maximum = dp[k];
}
}
return maximum;
}
int main(){
while(input()){
cout<<solve()<<"\n";
}
return 0;
}