共48道题,当前是第33

初赛真题

01 #include <iostream>
02 
03 #include <cstdio>
04 
05 using namespace std;
06 
07 int matrix [100] [100];
08 int total[100] [100];
09 int arr[100];
10 int dp[100];
11 
12 int MaxSubsequence(int n) {
13     int maximum = 0;
14     for(int i = 0; i < n; ++i){
15         if(i == 0) { 
16             dp[i] = arr[i];
17         }
18         else {
19             dp[i] = max(arr[i], dp[i - 1] + arr[i]);
20         }
21         maximum = max(maximum, dp[i]);
22     }
23     return maximum;
24 }
25 
26 int MaxSubmatrix(int n) {
27     int maximal = 0:
28     for(int i = 0; i < n; ++i){
29         for(int j = i; j < n; ++j){
30             for(int k = 0; k < n; ++k){
31                 if (i== 0) {
32                     arr[k] = total[j][k];
33                 } else {
34                     arr[k] = total[j][k] - total[i- 1][k];
35                 }
36             }
37             int current = MaxSubsequence(n);
38             maximal = max(maximal, current);
39         }
40     }
41     return maximal;
42 }
43 
44 int main() {
45     int n
46     scanf("%d", & n);
47     for(int i = 0; i < n; ++i)
48         for(int j = 0; j < n; ++j)
49             scanf("%d", &matrix[i][j]);
50     for(int i = 0; i < n; ++i)
51         for(int j = 0; j < n; ++j)
52             if (i== 0)
53                 total[i][j] = matrix[i][j];
54             else
55                 total[i][j] = total[i - 1][j] + matrix[i][j];
56     int answer = maxSubmatrix(n);
57     printf("%d\n", answer);
58     return 0;
59 }

1. B。$n = 0$ 程序会直接结束,不会有报错。
2. A。因为数组开的大小只有 $100$ ,因此若 $n = 200$ 会出现数组越界的问题。
3. A。模拟程序运行过程,得出结果为 $0$ 。
4. A。因为maximal初值是 $0$ ,所以小于 $0$ 的最大子矩阵是找不到的。
5. D。$100$ 单独构成一个 $1 * 1$ 的子矩阵,这就是最大子矩阵。
6. C。最大子矩阵如下:
9 2
-4 1
-1 8

Question

1. 若输入只有一个 0 ,则程序会发生运行错误。()

2. 若输入的第一个数为 200,则不论后面输入的数据如何,程序都会发生运行错误。()

3. 若输入如下数据:
2
0 0
0 0
则输出结果是( )

4. 若输入如下数据:
2
-1 -2
-3 -4
则输出结果是()

5. 若输入如下数据:
2
100 -1
-1 -100
则输出结果是()。

6. 若输入如下数据:
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 2
则输出结果是()