#include
#include
using namespace std;
int s[1005];
int arr[1005][1005];
int sum(int e,int r,int x,int y){
int count=0;
for(int i=e;ifor(int j=r;j//求矩阵和
}
}
return count;//将矩阵和返回给数组
}
int main()
{
int m,n,x,y,a;
scanf("%d",&a);
while(a--){
scanf("%d %d %d %d",&m,&n,&x,&y);
for(int i=0;ifor(int j=0;jscanf("%d",&arr[i][j]);
}
}
int e=0,r=0,w=0;
while(e+x-1!=m&&r+y-1!=n){
s[w++]=sum(e,r,x,y);
if(r+y-1!=m) r++;//判断横边界
else if(r+y-1==m&&e+x-1!=n){//判断纵边界
r=0,e++;
}
}
sort(s,s+w);//排序找最大的矩阵和
printf("%d\n",s[w-1]);
}
return 0;
}
你的s数组有可能溢出
不暴力的方法
#include<stdio.h>
int arr[1005][1005]={0};
//arr[i][j]表示矩阵前i行与前j列组成的子矩阵的和,此处不初始化对结果无影响
int main(){
int m,n,x,y,T,i,j,max,temp;
scanf("%d",&T);
while(T--){
max=0;
scanf("%d%d%d%d",&m,&n,&x,&y);
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
scanf("%d",&arr[i][j]);
arr[i][j]+=arr[i][j-1];
}
for(j=1;j<=n;j++){
arr[i][j]+=arr[i-1][j];
}
}
for(i=0;i<m-x;i++){
for(j=0;j<n-y;j++){
temp=arr[i+x][j+y]+arr[i][j]-arr[i][j+y]-arr[i+x][y];
if(max<temp)max=temp;
}
}
printf("%d\n",max);
}
return 0;
}
出现啥现象了啊?
```c++
#include <iostream>
#include <cstring>
using namespace std;
int main(){
int n;
while(cin>>n){
int matrix[n][n],sum[n],dp[n],maxSum;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>matrix[i][j];
maxSum=matrix[0][0];
for(int i=0;i<n;i++){
memset(sum,0,sizeof(sum));
for(int j=i;j<n;j++){
for(int k=0;k<n;k++)
sum[k]+=matrix[j][k];
dp[0]=sum[0];
maxSum=max(dp[0],maxSum);
for(int k=1;k<n;k++){
dp[k]=max(sum[k],dp[k-1]+sum[k]);
maxSum=max(dp[k],maxSum);
}
}
}
cout<<maxSum<<endl;
}
return 0;
}
```