結果
問題 |
No.572 妖精の演奏
|
ユーザー |
|
提出日時 | 2019-12-18 14:00:25 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,512 bytes |
コンパイル時間 | 164 ms |
コンパイル使用メモリ | 82,048 KB |
実行使用メモリ | 84,736 KB |
最終ジャッジ日時 | 2024-07-06 08:52:51 |
合計ジャッジ時間 | 3,712 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 12 WA * 8 |
ソースコード
import sys sys.setrecursionlimit(10000) def rec(i, j, k): if memo[i][j][k]!=-1: return memo[i][j][k] if i==0: memo[i][j][k] = A[j][k] return A[j][k] res = 0 for l in range(m): if res<A[j][k]+rec(i-1, k, l): res = A[j][k]+rec(i-1, k, l) to[V-i][j][k] = (k, l) memo[i][j][k] = res return res n = int(input()) n -= 1 m = int(input()) A = [list(map(int, input().split())) for _ in range(m)] V = m+100 memo = [[[-1]*m for _ in range(m)] for _ in range(V+1)] to = [[[0]*m for _ in range(m)] for _ in range(V)] for i in range(m): for j in range(m): rec(V, i, j) ans = 0 for i in range(m): for j in range(m): flag = [[-1]*m for _ in range(m)] cur_i, cur_j = i, j cnt = 0 flag[cur_i][cur_j] = cnt scores = [A[cur_i][cur_j]] while True: cur_i, cur_j = to[cnt][cur_i][cur_j] #print(cur_i, cur_j) if flag[cur_i][cur_j]>=0: #print(scores) ini = flag[cur_i][cur_j] loop = cnt+1-flag[cur_i][cur_j] #print(ini, loop) s1 = sum(scores[:ini]) s2 = sum(scores[ini:]) ans = max(ans, s1+(n-ini)//loop*s2+sum(scores[ini:ini+(n-ini)%loop])) break cnt += 1 flag[cur_i][cur_j] = cnt scores.append(A[cur_i][cur_j]) print(ans)