[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])
読んでも考えが浮かばない問題がある
もっと練習したいのですが、時間がありません.
時間を割いてやりますが、まだ足りません.
どのように時間を割り当てて、もっと時間をかけますか?