统计一个方阵中在四个方向长度为D的连续子序列的和

Posted djingjing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了统计一个方阵中在四个方向长度为D的连续子序列的和相关的知识,希望对你有一定的参考价值。

题目大意: 统计一个方阵中在四个方向长度为D的连续子序列的和

解题思路: 模拟

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 
  4 const int imax_n = 505;
  5 int a[imax_n][imax_n];
  6 int n, D;
  7 
  8 void solve()
  9 {
 10     int ans = 0;
 11     //hang
 12     for (int i = 0; i < n; ++i)
 13     {
 14         int tmp = 0;
 15         int j = 0;
 16         while (j < D)
 17         {
 18             tmp += a[i][j];
 19             ++j;
 20         }
 21         ans = max(ans, tmp);
 22         while (j < n)
 23         {
 24             tmp = tmp - a[i][j - D] + a[i][j];
 25             ++j;
 26             ans = max(ans, tmp);
 27         }
 28     }
 29     // printf("hang ans = %d\n", ans);
 30 
 31     for (int i = 0; i < n; ++i)
 32     {
 33         int tmp = 0;
 34         int j = 0;
 35         while (j < D)
 36         {
 37             tmp += a[j][i];
 38             ++j;
 39         }
 40         ans = max(ans, tmp);
 41         while (j < n)
 42         {
 43             tmp = tmp - a[j - D][i] + a[j][i];
 44             ++j;
 45             ans = max(ans, tmp);
 46         }
 47     }
 48     // printf("lei ans = %d\n", ans);
 49     // (i, 0) ++ ++
 50     for (int i = 0; i < n; ++i)
 51     {
 52         int j = 0;
 53         int tmp = 0;
 54         int k = i;
 55         while (k < n && j < D && j < n)
 56         {
 57             tmp += a[k][j];
 58             ++j;
 59             ++k;
 60         }
 61         if (j < D)
 62             continue;
 63         ans = max(ans, tmp);
 64         while (k < n && j < n)
 65         {
 66             tmp = tmp - a[k-D][j-D] + a[k][j];
 67             ans = max(ans, tmp);
 68             ++j;
 69             ++k;
 70         }
 71     }
 72     // printf("++++ans = %d\n", ans);
 73     //(0, i) ++ ++
 74     for (int i = 1; i < n; ++i)
 75     {
 76         int j = i;
 77         int k = 0;
 78         int tmp = 0;
 79         while (k < n && j < n && k < D)
 80         {
 81             tmp += a[k][j];
 82             ++k;
 83             ++j;
 84         }
 85         if (k < D)
 86             continue;
 87         ans = max(ans, tmp);
 88         while (k < n && j < n)
 89         {
 90             tmp = tmp - a[k - D ][j - D ] + a[k][j];
 91             ++j;
 92             ++k;
 93             ans = max(ans, tmp);
 94         }
 95     }
 96     // printf("++++ans = %d\n", ans);
 97 
 98     for (int i = 0; i < n; ++i)
 99     {
100         int j = 0;
101         int k = i;
102         int tmp = 0;
103         while (k >= 0 && j < n && j < D)
104         {
105             tmp += a[k][j];
106             ++j;
107             --k;
108         }
109         if (j < D)
110             continue;
111         ans = max(ans, tmp);
112         while (k >= 0 && j < n)
113         {
114             tmp = tmp - a[k + D][j - D ] + a[k][j];
115             ans = max(ans, tmp);
116             --k;
117             ++j;
118         }
119     }
120     // printf("--++ans = %d\n", ans);
121 
122     for (int i = 0; i < n; ++i)
123     {
124         int j = i;
125         int k = n-1;
126         int tmp = 0;
127         int step  = 0;
128         while (k >= 0 && j < n && step < D)
129         {
130             tmp += a[k][j];
131             ++j;
132             --k;
133             ++step;
134         }
135         if (step < D)
136             continue;
137         ans = max(ans, tmp);
138         while (k >= 0 && j < n)
139         {
140             tmp = tmp - a[k + D ][j - D ] + a[k][j];
141             ans = max(ans, tmp);
142             --k;
143             ++j;
144         }
145     }
146     // printf("--++ans = %d\n", ans);
147     printf("%d\n", ans);
148 }
149 
150 int main()
151 {
152 #ifndef ONLINE_JUDGE
153     freopen("test.txt", "r", stdin);
154 #endif // ONLINE_JUDGE
155     scanf("%d%d", &n, &D);
156     for (int i = 0;i < n; ++i)
157     {
158         for (int j = 0; j < n; ++j)
159         {
160             scanf("%d", &a[i][j]);
161         }
162     }
163     solve();
164     return 0;
165 }

 

以上是关于统计一个方阵中在四个方向长度为D的连续子序列的和的主要内容,如果未能解决你的问题,请参考以下文章

[bzoj P4504] K个串

最长公共子序列

求和为0的最长连续子序列长度

最大子序列和 (单调队列优化DP)

华为OD机试真题 C++ 实现最多等和不相交连续子序列2022.11 Q4 新题

华为OD机试真题 Python 实现最多等和不相交连续子序列2022.11 Q4 新题