From c24b43ab635814f08b49854f7f81fbeac9edb99d Mon Sep 17 00:00:00 2001 From: Zixuan Zhu Date: Fri, 30 May 2025 23:47:50 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=A8=A1=E6=8B=9F=E8=80=83=E7=AC=AC?= =?UTF-8?q?=E5=85=AD=E9=A2=98=E8=A7=A3=E7=AD=94=201768?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openjudge/1768/1768.md | 42 ++++++++++++++++++++++++++++++++++++ openjudge/1768/2410307209.md | 24 +++++++++++++++++++++ openjudge/1768/2410307209.py | 37 +++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 openjudge/1768/1768.md create mode 100644 openjudge/1768/2410307209.md create mode 100644 openjudge/1768/2410307209.py diff --git a/openjudge/1768/1768.md b/openjudge/1768/1768.md new file mode 100644 index 00000000..b07c1504 --- /dev/null +++ b/openjudge/1768/1768.md @@ -0,0 +1,42 @@ +# 25TF6:最大子矩阵 +总时间限制: 1000ms 内存限制: 65536kB + +--- +## 描述 +已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。 + +比如,如下4 * 4的矩阵 + +0 -2 -7 0 +9 2 -6 2 +-4 1 -4 1 +-1 8 0 -2 + +的最大子矩阵是 + +9 2 +-4 1 +-1 8 + +这个子矩阵的大小是15。 + +--- +## 输入 +输入是一个N * N的矩阵。输入的第一行给出N (0 < N <= 100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N^2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[-127, 127]。 + +--- +## 输出 +输出最大子矩阵的大小。 + +--- +## 样例输入 +``` +4 +0 -2 -7 0 9 2 -6 2 +-4 1 -4 1 -1 +8 0 -2 +``` +--- +## 样例输出 + +15 diff --git a/openjudge/1768/2410307209.md b/openjudge/1768/2410307209.md new file mode 100644 index 00000000..adaf5e57 --- /dev/null +++ b/openjudge/1768/2410307209.md @@ -0,0 +1,24 @@ +# 状态:[Accepted](http://xzmdsa.openjudge.cn/2025examreview/solution/49239210/) + +``` +基本信息 +#:49239210 +题目:25TF6 +提交人:2410307209 朱子轩 +内存:4396kB +时间:1227ms +语言:Python3 +提交时间:2025-05-23 10:53:14 +``` +## 分析问题: +本题显然需要使用一个动归数组求出最大值,因为完全枚举是不可能的。而且本题拥有最佳子结构这一个特性,故考虑使用动归解题。 +## 解决思路: +本题的核心想法在于降维。 +前置知识:我们可以很轻松的求出一个一维数组的最大子序列: + +使用'dp[i]'(表示以第i项为尾的前提下的最大子序列) + +不难看出dp[i]=max(dp[i-1]+value[i],value[i])即要不要前面的情况 +最大子矩阵大小为max(dp) + +有了这个想法,我们只需要对二维数组降维即可,即依次枚举子矩阵的宽(从1到i),并将子矩阵的列在宽方向上求和,就降维得到了一维的数组。改变求和起始位点,因此可以求出宽为任意值的最大子矩阵。再依次枚举宽即可 \ No newline at end of file diff --git a/openjudge/1768/2410307209.py b/openjudge/1768/2410307209.py new file mode 100644 index 00000000..649f09fb --- /dev/null +++ b/openjudge/1768/2410307209.py @@ -0,0 +1,37 @@ +import sys + +def find_sum(line,n): + dp=[0]*(n+1) + for i in range(1,n+1): + dp[i]=max(dp[i-1]+line[i-1],line[i-1]) + return max(dp) + +def calculate_column(height,matrix,n):#height*k(k从1-n)矩阵和的最大值 + global max_sum + for j in range(n - height): # j表示取得是哪几个连续行(从j开始) + column = [] + for i in range(0,n):#如tie可考虑用列前缀和处理,此处的i表示横坐标到哪行了 + column.append(sum(line[i] for line in matrix[j:j+height+1])) + summ=find_sum(column,n) + if summ>max_sum: + max_sum=summ + +def main(): + global max_sum + max_sum=-10000000 + n=int(input()) + inp=sys.stdin.read().strip() + matrix=[[0]*n for _ in range(n)] + i=j=0 + for strs in inp.split(): + matrix[i][j]=int(strs) + j+=1 + if j==n: + j-=n + i+=1 + for h in range(n): + calculate_column(h, matrix, n) + print(max_sum) + +if __name__=='__main__': + main() \ No newline at end of file From 4d5fcf2e3bad9d2fa15c8d5d32df3853519512d5 Mon Sep 17 00:00:00 2001 From: Zixuan Zhu Date: Tue, 3 Jun 2025 16:51:24 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=9B=B4=E9=AB=98=E6=95=88=E7=9A=84=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\347\232\204\347\256\227\346\263\225.py" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 "openjudge/1768/2410307209_\346\233\264\351\253\230\346\225\210\347\232\204\347\256\227\346\263\225.py" diff --git "a/openjudge/1768/2410307209_\346\233\264\351\253\230\346\225\210\347\232\204\347\256\227\346\263\225.py" "b/openjudge/1768/2410307209_\346\233\264\351\253\230\346\225\210\347\232\204\347\256\227\346\263\225.py" new file mode 100644 index 00000000..c14b27e2 --- /dev/null +++ "b/openjudge/1768/2410307209_\346\233\264\351\253\230\346\225\210\347\232\204\347\256\227\346\263\225.py" @@ -0,0 +1,40 @@ +import sys + + +def kadane(arr): + max_ = arr[0] + current = arr[0] # 记录以当前元素结尾的最大和 + + for i in range(1, len(arr)): + current = max(arr[i], current + arr[i]) + max_ = max(max_, current) + + return max_ + + +def main(): + n = int(input()) + matrix = [[0] * n for _ in range(n)] + if n > 0: + inp = sys.stdin.read().strip() + elements = [int(s) for s in inp.split()] + k = 0 + for r in range(n): + for c in range(n): + if k < len(elements): + matrix[r][c] = elements[k] + k += 1 + max_sum = -float('inf') + for r1 in range(n): + temp_sums = [0] * n + for r2 in range(r1, n): + for c in range(n): # 遍历每一列 + temp_sums[c] += matrix[r2][c] + current_max = kadane(temp_sums) + if current_max > max_sum: + max_sum = current_max + + print(max_sum) + +if __name__ == '__main__': + main() From 9367c2d810577275c1bcef49028a23dde96b499c Mon Sep 17 00:00:00 2001 From: Zixuan Zhu Date: Tue, 3 Jun 2025 16:53:10 +0800 Subject: [PATCH 3/3] Delete 1768.md --- openjudge/1768/1768.md | 42 ------------------------------------------ 1 file changed, 42 deletions(-) delete mode 100644 openjudge/1768/1768.md diff --git a/openjudge/1768/1768.md b/openjudge/1768/1768.md deleted file mode 100644 index b07c1504..00000000 --- a/openjudge/1768/1768.md +++ /dev/null @@ -1,42 +0,0 @@ -# 25TF6:最大子矩阵 -总时间限制: 1000ms 内存限制: 65536kB - ---- -## 描述 -已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。 - -比如,如下4 * 4的矩阵 - -0 -2 -7 0 -9 2 -6 2 --4 1 -4 1 --1 8 0 -2 - -的最大子矩阵是 - -9 2 --4 1 --1 8 - -这个子矩阵的大小是15。 - ---- -## 输入 -输入是一个N * N的矩阵。输入的第一行给出N (0 < N <= 100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N^2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[-127, 127]。 - ---- -## 输出 -输出最大子矩阵的大小。 - ---- -## 样例输入 -``` -4 -0 -2 -7 0 9 2 -6 2 --4 1 -4 1 -1 -8 0 -2 -``` ---- -## 样例输出 - -15