白駿11054号最長のVitonic部分数列
白駿11054号最長のVitonic部分数列
https://www.acmicpc.net/problem/11054
Pythonコード
import sys
N = int(sys.stdin.readline())
numbers = list(map(int, sys.stdin.readline().split()))
dp = [0 for _ in range(N)]
dp_inverse = [0 for _ in range(N)]
for i in range(N):
for v in range(i):
if numbers[i] > numbers[v]:
dp[i] = max(dp[i], dp[v])
dp[i]+=1
for i in range(N):
for v in range(i):
if numbers[N-1-i] > numbers[N-1-v]:
dp_inverse[N-1-i] = max(dp_inverse[N-1-i], dp_inverse[N-1-v])
dp_inverse[N-1-i]+=1
result = 0
for i in range(N):
result = max(result, dp[i] + dp_inverse[i])
print(result - 1)
解法
ローカル数列問題ではダイナミックプログラミングに慣れていない.
悩みの解決法をご紹介します
この2つの方法は最初から考えられ実施されたことがある.
数字表を順番に回して、ある値が出るたびに、規則的に変えるよりも、全部取り替えるというケースもあります.
それぞれに計算をやり直し、それが実現すれば条件文だけでなく時間の複雑さも増す.
そこで,上記のコードに示すように実装方法を変更した.
dpに最大
Reference
この問題について(白駿11054号最長のVitonic部分数列), 我々は、より多くの情報をここで見つけました https://velog.io/@yh20studio/백준-11054번-가장-긴-바이토닉-부분-수열テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol