【题目链接】信息学奥赛一本通(C++版)在线评测系统
【题解思路】
1.动态规划:lie [ j ][ i ]表示第 j 列从第一行到第 i 行的数和。
注意 需要全局变量或初始化为0,(全局变量自动初始化为0)下标从1开始。
2.遍历: 先确定上下边界,左右边界从1到n遍历,第 v 列的第 i 行到第 j 行的和为lie [ v ][ j ] - lie [ v ][ i - 1 ]。最小子矩阵为1 * 1,上下边界可以相等,左右边界也可以相等。
【代码】
#include<iostream>
using namespace std;
const int N=105;
int a[N][N];
int lie[N][N]; //lie [ j ][ i ]表示第 j 列从第一行到第 i 行的数和。
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
lie[j][i]=lie[j][i-1]+a[i][j];
}
}
int ma=-0x3f3f3f; //初始化最大值为负无穷(有负数)
for(int i=1;i<=n;i++) //上边界
{
for(int j=i;j<=n;j++) //下边界
{
for(int u=1;u<=n;u++) //左边界
{
int sum=0;
for(int v=u;v<=n;v++) //右边界
{
sum+=lie[v][j]-lie[v][i-1];
if(sum>ma) ma=sum;
}
}
}
}
cout<<ma;
return 0;
}