很经典的一道问题,必须求出每个子矩阵的解。
有些类似动态规划的思想,a[i][j]表示o-i行,0-j列元素的值,通过它求出每个子矩阵的值。
#include<iostream>
#include<stdio.h>
using namespace std;
int a[51][51] = {0};
int main()
{
int n,sum,x,result,flag;
while(cin>>n>>sum)
{
flag = 1;
//构造矩阵
for(int i =1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
cin>>x;
a[i][j] = x+a[i][j-1]+a[i-1][j]-a[i-1][j-1];
}
}
//求所有和
for(int i =1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
for(int k =0;k<=i;++k)
{
for(int l=0;l<=j;++l)
{
result = a[i][j]-a[k][j]-a[i][l]+a[k][l];
if(result == sum)
{
flag = 0;
break;
}
}
if(flag ==0)
break;
}
if(flag ==0)
break;
}
if(flag ==0)
break;
}
if(flag == 0)
printf("yes\n");
else
printf("no\n");
}
return 1;
}