LoginSignup
1
1

More than 1 year has passed since last update.

ABC165 C - Many Requirements 再帰使わずに多重for使うとただのタイピング力

Last updated at Posted at 2023-01-28

問題はこれ→https://atcoder.jp/contests/abc165/tasks/abc165_c
結構有名だと思う。

普通の解法

再帰関数を使う。
https://atcoder.jp/contests/abc165/submissions/37076168

n, m, q = map(int, input().split())
a, b, c, d = [0] * q, [0] * q, [0] * q, [0] * q
for i in range(q):
  a[i], b[i], c[i], d[i] = map(int, input().split())
  a[i] -= 1
  b[i] -= 1
def solve(x):
  res = 0
  if len(x) == n:
    for i in range(q):
      if x[b[i]] - x[a[i]] == c[i]:
        res += d[i]
    return res
  if len(x) == 0:
    bef = 1
  else:
    bef = x[-1]
  for i in range(bef, m + 1):
    res = max(res, solve(x + [i]))
  return res
print(solve([]))

多重for(タイピング力w)

Nの値で場合分け。

n, m, q = map(int, input().split())
a = []
b = []
c = []
d = []
for _ in range(q):
  A, B, C, D = map(int, input().split())
  A -= 1
  B -= 1
  a.append(A)
  b.append(B)
  c.append(C)
  d.append(D)
def score(t):
  res = 0
  for i, j, k, l in zip(a, b, c, d):
    if t[j] - t[i] == k:
      res += l
  return res
ans = 0
if n == 2:
  for i0 in range(1, m + 1):
    for i1 in range(i0, m + 1):
      ans = max(ans, score([i0, i1]))
if n == 3:
  for i0 in range(1, m + 1):
    for i1 in range(i0, m + 1):
      for i2 in range(i1, m + 1):
        ans = max(ans, score([i0, i1, i2]))
if n == 4:
  for i0 in range(1, m + 1):
    for i1 in range(i0, m + 1):
      for i2 in range(i1, m + 1):
        for i3 in range(i2, m + 1):
          ans = max(ans, score([i0, i1, i2, i3]))
if n == 5:
  for i0 in range(1, m + 1):
    for i1 in range(i0, m + 1):
      for i2 in range(i1, m + 1):
        for i3 in range(i2, m + 1):
          for i4 in range(i3, m + 1):
            ans = max(ans, score([i0, i1, i2, i3, i4]))
if n == 6:
  for i0 in range(1, m + 1):
    for i1 in range(i0, m + 1):
      for i2 in range(i1, m + 1):
        for i3 in range(i2, m + 1):
          for i4 in range(i3, m + 1):
            for i5 in range(i4, m + 1):
              ans = max(ans, score([i0, i1, i2, i3, i4, i5]))
if n == 7:
  for i0 in range(1, m + 1):
    for i1 in range(i0, m + 1):
      for i2 in range(i1, m + 1):
        for i3 in range(i2, m + 1):
          for i4 in range(i3, m + 1):
            for i5 in range(i4, m + 1):
              for i6 in range(i5, m + 1):
                ans = max(ans, score([i0, i1, i2, i3, i4, i5, i6]))
if n == 8:
  for i0 in range(1, m + 1):
    for i1 in range(i0, m + 1):
      for i2 in range(i1, m + 1):
        for i3 in range(i2, m + 1):
          for i4 in range(i3, m + 1):
            for i5 in range(i4, m + 1):
              for i6 in range(i5, m + 1):
                for i7 in range(i6, m + 1):
                  ans = max(ans, score([i0, i1, i2, i3, i4, i5, i6, i7]))
if n == 9:
  for i0 in range(1, m + 1):
    for i1 in range(i0, m + 1):
      for i2 in range(i1, m + 1):
        for i3 in range(i2, m + 1):
          for i4 in range(i3, m + 1):
            for i5 in range(i4, m + 1):
              for i6 in range(i5, m + 1):
                for i7 in range(i6, m + 1):
                  for i8 in range(i7, m + 1):
                    ans = max(ans, score([i0, i1, i2, i3, i4, i5, i6, i7, i8]))
if n == 10:
  for i0 in range(1, m + 1):
    for i1 in range(i0, m + 1):
      for i2 in range(i1, m + 1):
        for i3 in range(i2, m + 1):
          for i4 in range(i3, m + 1):
            for i5 in range(i4, m + 1):
              for i6 in range(i5, m + 1):
                for i7 in range(i6, m + 1):
                  for i8 in range(i7, m + 1):
                    for i9 in range(i8, m + 1):
                      ans = max(ans, score([i0, i1, i2, i3, i4, i5, i6, i7, i8, i9]))
print(ans)

3021Byte。あー疲れた💦💦💦💦
今日もABC頑張るか

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1