質問編集履歴
1
配列を1次元化した測定結果を追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -24,6 +24,8 @@
|
|
24
24
|
|
25
25
|
|
26
26
|
|
27
|
+
# オンラインジャッジシステムでの処理時間: 約3.5秒
|
28
|
+
|
27
29
|
def find_square0(data):
|
28
30
|
|
29
31
|
max_size = 0
|
@@ -104,6 +106,8 @@
|
|
104
106
|
|
105
107
|
```python
|
106
108
|
|
109
|
+
# オンラインジャッジシステムでの処理時間: 約2.8秒
|
110
|
+
|
107
111
|
def find_square2(data):
|
108
112
|
|
109
113
|
max_size = 0
|
@@ -158,6 +162,100 @@
|
|
158
162
|
|
159
163
|
|
160
164
|
|
165
|
+
**2017-08-28追記**
|
166
|
+
|
167
|
+
okateimさんにコメントいただいた、配列(リスト)の1次元化を試してみました。
|
168
|
+
|
169
|
+
配列を一つだけ確保する方式だと、配列のサイズが大きくなった時の速度ペナルティが厳しいようです。
|
170
|
+
|
171
|
+
```python
|
172
|
+
|
173
|
+
# サイズ固定、オンラインジャッジシステムでの処理時間: 約4.9秒
|
174
|
+
|
175
|
+
def find_square4(data):
|
176
|
+
|
177
|
+
max_size = 0
|
178
|
+
|
179
|
+
dp = [0 for _ in range(1024*1024)]
|
180
|
+
|
181
|
+
# '.'のマスを1に
|
182
|
+
|
183
|
+
for y, row in enumerate(data):
|
184
|
+
|
185
|
+
for x, c in enumerate(row):
|
186
|
+
|
187
|
+
if c == '.':
|
188
|
+
|
189
|
+
dp[y*1024+x] = 1
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
# 対象のマスから左上に向かって、何マスの正方形が確保できるかチェックする
|
194
|
+
|
195
|
+
for y in range(1, len(data)):
|
196
|
+
|
197
|
+
for x in range(1, len(data)):
|
198
|
+
|
199
|
+
if dp[y*1024+x] == 1:
|
200
|
+
|
201
|
+
dp[y*1024+x] = min(dp[(y-1)*1024+x-1], dp[(y-1)*1024+x], dp[y*1024+x-1]) + 1
|
202
|
+
|
203
|
+
if dp[y*1024+x] > max_size:
|
204
|
+
|
205
|
+
max_size = dp[y*1024+x]
|
206
|
+
|
207
|
+
return max_size
|
208
|
+
|
209
|
+
```
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
```python
|
214
|
+
|
215
|
+
# サイズ可変、オンラインジャッジシステムでの処理時間: 約5.2秒
|
216
|
+
|
217
|
+
def find_square4_2(data):
|
218
|
+
|
219
|
+
max_size = 0
|
220
|
+
|
221
|
+
n = len(data)
|
222
|
+
|
223
|
+
dp = [0 for _ in range(n**2)]
|
224
|
+
|
225
|
+
# '.'のマスを1に
|
226
|
+
|
227
|
+
for y, row in enumerate(data):
|
228
|
+
|
229
|
+
for x, c in enumerate(row):
|
230
|
+
|
231
|
+
if c == '.':
|
232
|
+
|
233
|
+
dp[y*n+x] = 1
|
234
|
+
|
235
|
+
|
236
|
+
|
237
|
+
# 対象のマスから左上に向かって、何マスの正方形が確保できるかチェックする
|
238
|
+
|
239
|
+
for y in range(1, len(data)):
|
240
|
+
|
241
|
+
for x in range(1, len(data)):
|
242
|
+
|
243
|
+
if dp[y*n+x] == 1:
|
244
|
+
|
245
|
+
dp[y*n+x] = min(dp[(y-1)*n+x-1], dp[(y-1)*n+x], dp[y*n+x-1]) + 1
|
246
|
+
|
247
|
+
if dp[y*n+x] > max_size:
|
248
|
+
|
249
|
+
max_size = dp[y*n+x]
|
250
|
+
|
251
|
+
return max_size
|
252
|
+
|
253
|
+
```
|
254
|
+
|
255
|
+
|
256
|
+
|
257
|
+
|
258
|
+
|
161
259
|
|
162
260
|
|
163
261
|
###補足情報(言語/FW/ツール等のバージョンなど)
|