宇宙第一小仙女\(^o^)/~~萌量爆表求带飞=≡Σ((( つ^o^)つ~dalao们点个关注呗~~
Problem is coming~~~~
Description
铁牌狗最近迷上了一款游戏,但铁牌狗实在是太笨了,他还是要请求你的帮助。
有一个n行m列的矩阵A,矩阵A中每个数字均为正整数,现在铁牌狗要在其中选出一个r行c列的子矩阵B,这个子矩阵B中各个数字之和即为铁牌狗的得分,请你帮铁牌狗计算出他的最高得分是多少。
Input
首先输入一个组数T(1 <= T <= 10),表示接下来要输入T组数据。
首先输入四个整数n,m,r,c(1 <= n,m <= 1000,1 <=r <= n ,1 <= c <= m)。
接下来的n行,每行m个数,代表A中的各个数字。
矩阵A中的各个数字X均满足 1<=X <=1000。
Output
Sample Input
2 4 4 4 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 4 4 2 2 1 2 3 3 1 2 3 4 3 3 3 4 1 1 5 5
Sample Output
40 17
这题其实不难,但是容易是超限,四重循环也是吓死宝宝了....
思路:
1.To begin with,先考虑框的大小正好是整个矩阵的时候,那就没有最大最小了,直接输出矩阵的和就KO咯~
2.In addition,再考虑框的长宽都是1的时候,那就是找这个矩阵里的最大值咯~
3.What's more,除了上边两种情况,就是这种情况咯,也是本题关键,四重循环吓死你们哈哈哈~
4.Last but not the least,得到的结果都存到另外一个数组里,直接快排找最大printf就好啦~
依旧hint一下...数组下标太大可以改全局,而且是多组输入单组就不对了哦...顺便emmm...思路里的每条的开头是英语作文里最常用的连接词,顺便背一下咯~
--------------------------------------------------------------------我只是一条可爱的分界线----------------------------------------------------------------------------
#include<bits/stdc++.h>
using namespace std;
long long int p[1001][1001],q[1001010];
int main()
{
long long int i,j,k,T,m,n,a,b,c,r,s,z;
while(scanf("%lld",&T)!=EOF){
for(z=1;z<=T;z++){
m=0;n=0;
memset(p,0,sizeof(p));
memset(q,0,sizeof(q));
scanf("%lld%lld%lld%lld",&a,&b,&r,&c);
for(i=0;i<=a-1;i++)
for(j=0;j<=b-1;j++)
scanf("%lld",&p[i][j]);
if(a==r&&b==c){
for(i=0;i<=a-1;i++)
for(j=0;j<=b-1;j++)
m+=p[i][j];
printf("%lld\n",m);
}
else if(r==1&&c==1){
m=p[0][0];
for(i=0;i<=a-1;i++)
for(j=0;j<=b-1;j++)
if(p[i][j]>m)
m=p[i][j];
printf("%lld\n",m);
}
else{
n=0;
for(s=0;s<=b-c;s++){
for(i=0;i<=a-r;i++){
for(j=i;j<=r+i-1;j++)
for(k=s;k<=c+s-1;k++)
q[n]+=p[j][k];
n++;
}
}
sort(q,q+n);
printf("%lld\n",q[n-1]);
}
}
}
return 0;
}
宇宙第一小仙女\(^o^)/~~萌量爆表求带飞=≡Σ((( つ^o^)つ~dalao们点个关注呗~~
欢迎访问https://blog.csdn.net/lxt_Lucia~~