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

A38905. (注.input()输入函数的括号中不允许添加任何信息)编程实现有一个N*M的矩阵方格,其中有些方格中有奖品,有些方格中没有奖品。小蓝需要从N*M的矩阵中选择一个方形区域,如果所选的正方形区域的一条对角线方格中都有奖品,其他方格都没有奖品,就会获得所选区域中的所有奖品,否则不能获得奖品。当给出N和M的值,及N*M的矩阵方格中摆放的奖品情况例如:N=5,M=6,奖品情况如下:选择上图红色正…

填空题 困难

题目描述

题目描述

(注.input()输入函数的括号中不允许添加任何信息)

编程实现

有一个N*M的矩阵方格,其中有些方格中有奖品,有些方格中没有奖品。小蓝需要从N*M的矩阵中选择一个方形区域,如果所选的正方形区域的一条对角线方格中都有奖品,其他方格都没有奖品,就会获得所选区域中的所有奖品,否则不能获得奖品。

当给出N和M的值,及N*M的矩阵方格中摆放的奖品情况

例如:N=5,M=6,奖品情况如下:

选择上图红色正方形区域,可以获得最多的4个奖品。

输入描述

第一行输入两个整数N和M(1≤N≤100,1≤M≤100),N表示矩阵的行数,M表示矩阵的列数,两个整数之间一个空格隔开

接下来输入N行,每行包括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

参考答案

n, m = map(int, input().split(' ')) ls = [] for i in range(n): ls.append([int(i) for i in input()[::2]]) def SUM(ls, start_i, start_j, r, c): sum_ = 0 for i in range(start_i, r + 1): sum_ += sum(ls[i][min(start_j, c):max(start_j, c) + 1]) return sum_ def dfsR(ls, start_i, start_j, i, j): if i >= n or j >= m or ls[i][j] == 0: return 0 elif SUM(ls, start_i, start_j, i, j) != i - start_i + 1: return 0 else: return dfsR(ls, start_i, start_j, i + 1, j + 1) + 1 def dfsL(ls, start_i, start_j, i, j): if i >= n or j < 0 or ls[i][j] == 0: return 0 elif SUM(ls, start_i, start_j, i, j) != i - start_i + 1: return 0 else: return dfsL(ls, start_i, start_j, i + 1, j - 1) + 1 res = 0 for i in range(n): for j in range(m): if ls[i][j] == 1: start_i, start_j = i, j res_r = dfsR(ls, start_i, start_j, i, j) res_l = dfsL(ls, start_i, start_j, i, j) res = max(res_r, res_l, res) print(res)
上一题 下一题