测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

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; }
上一题 下一题