#include<stdio.h>
#include<algorithm>
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;i<e+x;i++){
for(int j=r;j<r+y;j++){
count+=arr[i][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;i<m;i++){
for(int j=0;j<n;j++){
scanf("%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;
}
最大子矩阵问题 我用的暴力做法 不知道哪里出问题了
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- ksgpjhqf 2023-02-22 00:01关注
你的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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥20 机器学习能否像多层线性模型一样处理嵌套数据
- ¥20 西门子S7-Graph,S7-300,梯形图
- ¥50 用易语言http 访问不了网页
- ¥50 safari浏览器fetch提交数据后数据丢失问题
- ¥15 matlab不知道怎么改,求解答!!
- ¥15 永磁直线电机的电流环pi调不出来
- ¥15 用stata实现聚类的代码
- ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
- ¥20 docker里部署springboot项目,访问不到扬声器
- ¥15 netty整合springboot之后自动重连失效