「 じゃあ 最長増加部分列問題(LIS; Longest Increase Subsequence)を調べましょう!」
「 👆 棒グラフを描いておくと 大きさの比較をしやすいでしょう」
「 👆 例えば 上図のように線をつなげば (1, 2, 3, 5, 8)
という長さ5の数列が作れるわね」
「 じゃあ次は そいつより大きいやつの中で 一番小さいやつを探そうぜ?」
「 👆 じゃあ 3 は こっちだな。 その左の 5と 8も 確定だろ」
# Longest increase subsequence
cards = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8]
subseq = []
# 1周目
minimum = 999
min_index = -1
for i in range(0, len(cards)):
if cards[i] < minimum:
minimum = cards[i]
min_index = i
pass
print(f"(1周目) minimum={minimum} min_index={min_index}")
# 2周目
pre_minimum = minimum
minimum = 999
for i in range(min_index, len(cards)):
if pre_minimum < cards[i] and cards[i] < minimum:
minimum = cards[i]
min_index = i
pass
print(f"(2周目) minimum={minimum} min_index={min_index}")
# 3周目
pre_minimum = minimum
minimum = 999
for i in range(min_index, len(cards)):
if pre_minimum < cards[i] and cards[i] < minimum:
minimum = cards[i]
min_index = i
pass
print(f"(3周目) minimum={minimum} min_index={min_index}")
# 4周目
pre_minimum = minimum
minimum = 999
for i in range(min_index, len(cards)):
if pre_minimum < cards[i] and cards[i] < minimum:
minimum = cards[i]
min_index = i
pass
print(f"(4周目) minimum={minimum} min_index={min_index}")
# 5周目
pre_minimum = minimum
minimum = 999
for i in range(min_index, len(cards)):
if pre_minimum < cards[i] and cards[i] < minimum:
minimum = cards[i]
min_index = i
pass
print(f"(5周目) minimum={minimum} min_index={min_index}")
(1周目) minimum=1 min_index=1
(2周目) minimum=2 min_index=6
(3周目) minimum=3 min_index=9
(4周目) minimum=5 min_index=10
(5周目) minimum=8 min_index=11
# Longest increase subsequence
cards = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8]
subseq = []
min_index = 0
minimum = -1
# 1周目
pre_minimum = minimum
minimum = 999
for i in range(min_index, len(cards)):
if pre_minimum < cards[i] and cards[i] < minimum:
minimum = cards[i]
min_index = i
pass
print(f"(1周目) minimum={minimum} min_index={min_index}")
# 2周目
pre_minimum = minimum
minimum = 999
for i in range(min_index, len(cards)):
if pre_minimum < cards[i] and cards[i] < minimum:
minimum = cards[i]
min_index = i
pass
print(f"(2周目) minimum={minimum} min_index={min_index}")
# 3周目
pre_minimum = minimum
minimum = 999
for i in range(min_index, len(cards)):
if pre_minimum < cards[i] and cards[i] < minimum:
minimum = cards[i]
min_index = i
pass
print(f"(3周目) minimum={minimum} min_index={min_index}")
# 4周目
pre_minimum = minimum
minimum = 999
for i in range(min_index, len(cards)):
if pre_minimum < cards[i] and cards[i] < minimum:
minimum = cards[i]
min_index = i
pass
print(f"(4周目) minimum={minimum} min_index={min_index}")
# 5周目
pre_minimum = minimum
minimum = 999
for i in range(min_index, len(cards)):
if pre_minimum < cards[i] and cards[i] < minimum:
minimum = cards[i]
min_index = i
pass
print(f"(5周目) minimum={minimum} min_index={min_index}")
# Longest increase subsequence
cards = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8]
subseq = []
min_index = 0
minimum = -1
for j in range(0, 5):
pre_minimum = minimum
minimum = 999
for i in range(min_index, len(cards)):
if pre_minimum < cards[i] and cards[i] < minimum:
minimum = cards[i]
min_index = i
pass
print(f"({j}周目) minimum={minimum} min_index={min_index}")
「 停止条件って何なの? 5 じゃなくて、自動で判定するには」
「 minimum なやつが 見つからなかったら 停止すればいいんじゃないか?」
# Longest increase subsequence
cards = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8]
subseq = []
min_index = 0
minimum = -1
count = 1
while True:
pre_minimum = minimum
minimum = 999
for i in range(min_index, len(cards)):
if pre_minimum < cards[i] and cards[i] < minimum:
minimum = cards[i]
min_index = i
pass
# 停止条件
if minimum == 999:
break
print(f"({count}周目) minimum={minimum} min_index={min_index}")
count += 1
Crieitは個人で開発中です。
興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!