题意,问矩阵存不存在一个子矩阵满足子矩阵内所有元素的和等于某值
n只有50,但直接暴力肯定也不行,考虑构造一个矩阵b表示他左上方的矩阵的值,这样用b就可以表示出所有的子矩阵了
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
long long a[55][55];
int main()
{
int n,m,sum,x,flag;
while(~scanf("%d%d",&n,&m))
{
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
scanf("%d",&x);
a[i][j]=x+a[i-1][j]+a[i][j-1]-a[i-1][j-1];
}
// for(int i=1; i<=n; i++)
// {
// for(int j=1; j<=n; j++)
// cout<<a[i][j]<<" ";
// cout<<endl;
// }
flag=1;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
for(int k=1; k<=i; k++)
{
for(int l=1; l<=j; l++)
{
sum=a[i][j]+a[i-k][j-l]-a[i][j-l]-a[i-k][j];
//cout<<sum<<endl;
if(sum==m)
{
flag=0;
break;
}
}
if(flag==0)
break;
}
}
if(flag==0)
break;
}
if(flag==0)
printf("yes\n");
else
printf("no\n");
}
return 0;
}