#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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 CVRP 图论 物流运输优化
- ¥15 Tableau online 嵌入ppt失败
- ¥100 支付宝网页转账系统不识别账号
- ¥15 基于单片机的靶位控制系统
- ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
- ¥15 下图接收小电路,谁知道原理
- ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
- ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
- ¥15 手机接入宽带网线,如何释放宽带全部速度
- ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测