A41792. 奖品
填空题
困难
知识点
题目描述
奖品
题目描述:
有一个N*M的矩阵方格,其中有些方格中有奖品,有些方格中没有奖品。小蓝需要从N*的矩阵中选择一个正方形区域,如果所选的正方形区域的一个对角线方格中都有奖品,其他方格都没有奖品,就会获得所选区域中的所有奖品,否则不能获得奖品。
当给出N和M的值,及N*M的矩阵方格中摆放的奖品情况(0表示方格中没有奖品,1表示方格中有奖品),请你帮助小蓝找出一个正方形区域,能够获得数量最多的奖品,并将奖品数输出。
例如:N=5,M=6,奖品情况如下:

选择上图红色正方形区域,可以获得最多的4个奖品。
输入描述:
第一行输入两个整数N和M(1≤N≤100,1≤M≤100),N表示矩阵的行数,M表示矩阵的列数,两个整数之间一个空格隔开,接下来输入M行,每行包括M个0或者1(0表示方格中没有奖品,1表示方格中有奖品),0或者1之间一个空格隔开
输出描述:
输出一个整数,表示最多可以获得的奖品数
样例输入:
5 6
1 0 1 0 0 0
0 1 0 1 0 0
1 0 0 0 1 0
0 1 0 0 0 1
1 0 1 0 0 0
样例输出:
4
参考答案
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
int n,m,a[105][105],dp[105][105],maxn;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(a[i][j]==1 ){
int flag=0;
for (int x=i-1;x>=i-dp[i-1][j-1];x--)
if(a[x][j]==1){
flag=1;break;
}
for (int y=j-1;y>=j-dp[i-1][j-1];y--)
if(a[i][y]==1){
flag=1;break;
}
if(flag==0) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=1;
maxn=max(maxn,dp[i][j]);
}
}
cout<<maxn<<endl;
return 0;
}
上一题
下一题