[WEEK04] DAY31
DAY31
2021.12.01 WED
今日,2次元配列で見苦しい問題コードを修正し,重複エラーを発見した.
多分C言語駐車の進捗状況を把握しています.
接続リストがどのような資料構造であるかを学習した.
昨日気になった自動設置ワイドパンツタイムは駅でcrontabを使っていたそうです.
DP問題を解決するには、まず
まず、DP(N)が何を表しているかを確認する
それに関連する点火式を作ってみましょう.
2579段阶
この問題では,DP[N]は「N番目のステップを踏んだときの最大スコア」を表す.
そして問題の条件に従って点火式を確立すると.
DP[N] = max( step[N] + step[N-1] + DP[N-3],
........................ step[N] + DP[N-2])
このように表現されます
もっと練習してまず火式を求めなければならない.
コード#コード#
import sys
n = int(sys.stdin.readline())
stairs = [int(sys.stdin.readline()) for _ in range(n)]
dp = [[0 for _ in range(2)] for _ in range(n)]
# dp[n] = n번째 계단까지 밟았을 때 최대 점수
if n == 1:
print(stairs[0])
else:
dp[0][0] = stairs[0]
dp[1][0], dp[1][1] = stairs[1], stairs[1] + stairs[0]
for i in range(2, n): # n번째 = i
dp[i][0] = max(dp[i - 2][0], dp[i - 2][1]) + stairs[i] # 규칙2
dp[i][1] = dp[i - 1][0] + stairs[i] # 규칙1
print(max(dp[n - 1][0], dp[n - 1][1]))
..
同様に、この問題でも話しているルールが見つかり、点火式が確立されます.
味道2156葡萄酒
コード#コード#
n = int(input())
wine_list = [int(input()) for x in range(n)]
dp = [0]
dp.append(wine_list[0])
if(n > 1):
dp.append(wine_list[0] + wine_list[1])
print(wine_list)
print(dp)
# 연속 3잔을 마시지 않아야 하므로
# 1 : 이번 포도주를 먹고 이전 포도주를 먹지 않은 경우
# 2 : 이번 포도주를 먹고 이전 포도주도 먹은 경우
# 3 : 이번 포도주를 먹지 않아야 하는 경우
# 위 세가지 경우를 고려하여 max
for i in range(3, n + 1):
# wine_list는 0부터 시작하므로 i - 1로 해준다.
case_1 = wine_list[i - 1] + dp[i - 2]
case_2 = wine_list[i - 1] + wine_list[i - 2] + dp[i - 3]
case_3 = dp[i - 1]
max_value = max(case_1, case_2, case_3)
dp.append(max_value)
print(dp[n])
読んでも考えが浮かばない問題があるもっと練習したいのですが、時間がありません.
時間を割いてやりますが、まだ足りません.
どのように時間を割り当てて、もっと時間をかけますか?
Reference
この問題について([WEEK04] DAY31), 我々は、より多くの情報をここで見つけました https://velog.io/@yerimii11/WEEK04-DAY31テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol