gnrskd
@gnrskd (KD)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Pythonにて、forループを用いたリスト更新が思い通りの結果にならないので解決して欲しいです

解決したいこと

AtCoderをPythonで解いている者です。
先日のABC242コンテストのC問題を解くことができず、
その原因もわからないので教えて欲しいです。

Pythonのリストに仕様について。

Pythonにてforループを使ってリストの中身を更新していくと、思い通りの結果になりません。

該当するソースコード

N = int(input())

A = [[0]*9 for _ in range(N-1)]
A[0] =  [2,3,3,3,3,3,3,3,2]

if N == 2:
  ans = A
else:
  for i in range(1, N-1):
    for j in range(9):
      if j == 0:
        A[i][0] = A[i-1][0] + A[i-1][1]
      if j == 8:
        A[i][8]= A[i-1][7] + A[i-1][8]
      else:
        A[i][j]= A[i-1][j-1] + A[i-1][j] + A[i-1][j+1]
  ans = A

print(ans)

自分のやろうとしていること

N-1行、9列の二次元リストを考えていて、
0行目に[2, 3, 3, 3, 3, 3, 3, 3, 2]として

1<=i<=n-1 のiについて

i行目の1列目をA[i][0] = A[i-1][0]+ A[i-1][1]
i行目の2列目をA[i][2] = A[i-1][0]+ A[i-1][1] + A[i-1][2]
i行目の3列目をA[i][2] = A[i-1][1]+ A[i-1][2] + A[i-1][3]
...
i行目の8列目をA[i][7] = A[i-1][6]+ A[i-1][7] + A[i-1][8]
i行目の9列目をA[i][8] = A[i-1][7]+ A[i-1][8]

と更新していこうとしています。

N = 4として自分の[理想の出力]と[実際の出力]が以下の通りです。

例) N = 4 理想の出力結果

[[2, 3, 3, 3, 3, 3, 3, 3, 2], 
[5, 8, 9, 9, 9, 9, 9, 8, 5], 
[13, 22, 26, 27, 27, 27, 26, 22, 13]]

例) N = 4 実際の出力結果

[[2, 3, 3, 3, 3, 3, 3, 3, 2], 
[7, 8, 9, 9, 9, 9, 9, 8, 5], 
[20, 24, 26, 27, 27, 27, 26, 22, 13]]

何か原因がわかる方、教えていただきたいです。

0

2Answer

条件分岐の箇所を以下のように変更してください。

  if j == 0:
    A[i][0] = A[i-1][0] + A[i-1][1]
- if j == 8:
+ elif j == 8:
    A[i][8] = A[i-1][7] + A[i-1][8]
  else:
    A[i][j] = A[i-1][j-1] + A[i-1][j] + A[i-1][j+1]
2Like

Comments

  1. @gnrskd

    Questioner

    回答ありがとうございます!
    解決しました!原因がわかってよかったです。
  2. Pythonは多倍長精度整数で計算できるメリットはありますが、本問題は値が指数関数的に増加してしまうので、適宜modをとるようにしないと、TLEします。
    https://qiita.com/square1001/items/1aa12e04934b6e749962#2-2-%E5%A4%A7%E3%81%8D%E3%81%AA%E6%95%B0%E3%81%AE%E8%B6%B3%E3%81%97%E7%AE%97
    上の記事でも書かれている通り、n桁の整数の和の計算量はO(n)です。今回構成した配列Aを観察するとわかると思いますが、桁数はNに比例することがみてとれます。
    適宜modをとらないと、計算量がO(N^2)になり、TLEします。
    また、PyPyでないと10^6オーダーのループは厳しそうです。
  3. @gnrskd

    Questioner

    ご丁寧にありがとうございます!

直接の回答ではないですが・・・
AtCoderは他人の提出結果を見ることができるので、AC回答の中から最短長コードや最短実行時間コードなどを読んで、分からないところは自分で処理を分解して動作確認することで大変勉強になり、スキル習得が加速しますよ。

2Like

Comments

  1. @gnrskd

    Questioner

    参考にしてみます!ありがとうございます!

Your answer might help someone💌