[伯俊]9465シール(Python)
質問する
尚根の妹は文房具屋で2 n枚のシールを買った.シールは図(a)に示すように2行n列に並べられている.やさしい人はシールで机を飾ります.
やさしく購入したシールの質が悪い.シールを1枚引き裂くと、それらのシールと共有エッジのシールが引き裂かれ、使用できません.つまり、外したシールの左、右、上、下のシールは使用できません.
すべてのシールが貼れない優しさは各シールに点数をつけ、点数の和が最大に達し、シールを引き裂きたいと思っています.まず、図(b)のように各シールに点数をつけます.やさしいシール点数の最値を求めるプログラムを作成してください.すなわち,2 n個のマップのうち,スコアの和が最大であり,互いに共有しないエッジのセットを求める必要がある.
上図では、点数50、50、100、60のシールを選択した場合、点数は260となり、これが最大点数となります.点数が一番高い2枚のシール(100と70)はエッジを共有しているので、同時に分けることはできません.
入力
第1行は、試験例の個数Tを与える.各テストケースの最初の行にはn(1≦n≦100000)が与えられる.次の2行にはn個の整数があり、各整数はその位置に対応するシールの点数である.連続する2つの整数の間にスペースがあります.分数が0以上、100以下の整数.
しゅつりょく
各試験例は、2 n個のシールのうち、2辺を共有しないシール点数の最値を出力する.
に答える
liという名前のリストを作成して、入力した受信値とmaxリストという名前のリストを保存します.最初の値が含まれています.
maxリストに、li[0][0]+li[1]、li[1][0]+li[0][1]の値を入力します.
2番目の値を入力してもmax listより小さい1番目の値が表示されます.したがって、最初のマップの取り外し値が2番目のマップの取り外し値より大きいため、前の値を変数に入れます.
このように表現すれば、
max_list[1].append(max(max_list[0][0],li[0][1]+max_list[0][1]))
になりますコード#コード#
num = int(input())
for i in range(num):
n = int(input())
li = []
li.append(list(map(int,input().split())))
li.append(list(map(int,input().split())))
max_list = [[] for i in range(n)]
max_list[0] = [li[0][0],li[1][0]]
for i in range(1,n):
max_list[i].append(max(max_list[i-1][0],li[0][i]+max_list[i-1][1]))
max_list[i].append(max(max_list[i-1][1],li[1][i]+max_list[i-1][0]))
print(max(max_list[n-1]))
Reference
この問題について([伯俊]9465シール(Python)), 我々は、より多くの情報をここで見つけました https://velog.io/@hope1213/백준-9465-스티커-파이썬テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol