Atcoder水色への精選 100 問 全探索 : 全列挙(Python)

E869120さんが作成した、精選100問を解いていきます
今回は1~4までの「全探索 : 全列挙」をやります
qiita.com

目次



1 How many ways?

問題文
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_7_B&lang=ja

2つ目までの範囲を決めたときの残った3番目の要素が目的の数値に等しいかをカウントします
(ちなみに3番目までを全探索したときでも 10^6程度なので間に合うっぽい)

pythonでの実装例

li = []

while True:
    n,m = map(int,input().split())
    if n == 0 and m == 0:
        break
    li.append((n,m))

for n,m in li:
    point = 0
    for one in range(1,n-1):
        for two in range(one+1,n):
            three = m-one-two
            if two < three < n+1:
                point += 1
    print(point)



2 B - 105

問題文
atcoder.jp

1からNまでの奇数のうち、各数字の約数を全列挙したときの長さが8のものの個数をカウントします

pythonでの実装例

n = int(input())

# 約数列挙
def make_divisors(n):
    divisors = []
    for i in range(1, int(n**0.5)+1):
        if n % i == 0:
            divisors.append(i)
            if i != n // i:
                divisors.append(n//i)
    divisors.sort()
    return divisors

point = 0

# 奇数全探索
for i in range(1,n+1,2):
    j = make_divisors(i)
    if len(j) == 8:
        point += 1

print(point)



3 AtCoder Beginner Contest 122 B - ATCoder

問題文
atcoder.jp

部分文字列を全探索していきます(空文字は除く)
部分文字列の先頭と終了地点を決め、作られた文字列がACGT文字列だった場合をカウントします
ACGT文字列だった場合、さらに文字列の長さが今までのACGT文字列よりも長かった場合、更新をします
フラグ管理やmax関数を使うと便利です

pythonでの実装例

s = input()
n = len(s) # 文字の長さ
max_length = 0 # 最大長さ

for i in range(n):
    for j in range(i,n):
        t = s[i:j+1]
        flag = True # ACGT文字列であるかのフラグ
        for k in t:
            if k not in "AGCT":
                flag = False
        if flag:
            max_length = max(max_length,len(t))

print(max_length)



4 C - カラオケ

問題文
atcoder.jp

1曲目と2曲目の組み合わせを求めておき、各パターンの得点を数えます
得点が過去の最大値を上回った場合は更新をします

pythonでの実装例

n,m = map(int,input().split())
a = [list(map(int,input().split())) for _ in range(n)]

ans = 0

# 1曲目と2曲目を全探索する
for i in range(m-1):
    for j in range(i+1,m):
        point = 0
        # n人が曲を歌った時の得点を求める
        for k in range(n):
            point += max(a[k][i],a[k][j])
        # 最大値を更新 
        ans = max(ans,point)

print(ans)

次回↓
工夫して通り数を減らす全列挙
algo-archit.hatenablog.com