ABC118D Match Matching

ABC118 に参加しました。
結果としては3完で+32という微妙な結果に終わりました。

コンテスト終了後にD問題のMatch Matchingを解いたので、コードを載せてみます。

方針

与えられたマッチを"ちょうど"使った時の最大の数を表示する。
この"ちょうど"というところから、貪欲法でやるよりもDPでやったほうがいいという気持ちになりました。
(コンテスト本番にはDFSでやろうと思ってましたが、計算量や"ちょうど"という制約が面倒になります)

解説の資料には桁数を保存して、後から最大の数値を生成する感じになっています。
私はPython3とC++の両刀使い(どっちつかず)なので、Pythonでやってlong long int の壁を越えることができます。
そこで
dp(i) := マッチをi本使った時の最大の数
として、数を文字列に変換せず直接代入しました。

コードは次の通りです。

match = [2,5,5,4,5,6,3,7,6]
n,m=map(int,input().split())
aa=list(map(int,input().split()))
#9以上多めにとってout of range を防ぐ
dp=[-1]*(n+10)

dp[0]=0
for i in range(n+1):
        for nums in aa:
                #この条件がないと、i本までで表現できる最大の数になる
                if dp[i] == -1 :continue
                dp[i+match[nums-1]] = max(dp[i]*10+nums,dp[i+match[nums-1]])

print(dp[n])

DPはちゃんと勉強していくつもりです。
いつかコンテスト本番でDを解いて見たいです。