atcoder ABC165 C - Many Requirementsの勉強

atcoder.jp

・参考:
よくやる再帰関数の書き方 〜 n 重 for 文を機械的に 〜 - けんちょんの競プロ精進記録

・やったこと:参考記事の内容をpythonで勉強した。長さがNのリストAをDFSで全探索する。その時の得点(score)が一番高いものがansになる。

#参考:https://drken1215.hatenablog.com/entry/2020/05/04/190252
n,m,q=map(int,input().split())
a=[0 for _ in range(q)]
b=[0 for _ in range(q)]
c=[0 for _ in range(q)]
d=[0 for _ in range(q)]
for i in range(q):
  aq,bq,cq,dq=map(int,input().split())
  #aq,bqはインデックスになるので0からにする。
  aq-=1
  bq-=1
  a[i],b[i],c[i],d[i]=aq,bq,cq,dq
#得点  
def score(A):
  res=0
  for i in range(q):
    if A[b[i]]-A[a[i]]==c[i]:
      res+=d[i]
  return res

def dfs(A):
  if len(A)==n:
    return score(A)
  
  ans=0
  prev=A[-1] if len(A)>0 else 1  #len(A)>0のときprev=A[-1]、それ以外はprev=1。Aが単調増加の条件よりA[-1]より大きい値を試す必要があるので。
  for i in range(prev,m+1):
    A.append(i)
    ans=max(ans,dfs(A))   #スコアが最大のものをansにする。
    A.pop()
  return ans

print(dfs([]))