[BOJ]22871橋を渡る(大)
6044 ワード
最初のプール(タイムアウト) dp[x][y]
:x
からy
までのKKの最大値solve(x, y)
:dp[x][y]
の関数を求めます.再帰路実施
0->4を求めれば良いのですが、全てのケースを求めれば結果的に耳が多くなってタイムアウトだと思います.
2番目の答え(正しい) dp[x]
:x
からN-1
までのKKの最大値solve(x)
:dp[x]
の関数を求めます.再帰路実施
コード#コード# import sys
#sys.stdin = open('input.txt', 'r')
sys.setrecursionlimit(int(1e5))
input = sys.stdin.readline
N = int(input())
A = list(map(int, input().split()))
dp = [-1 for _ in range(N)]
def solve(start):
# 시작과 목표가 같으면 0
if start == N - 1:
dp[start] = 0
return 0
# 이미 계산한 거리라면 바로 리턴
if dp[start] != -1:
return dp[start]
# 리턴값
ret = float('inf')
# start -> i -> (N - 1)
for i in range(start + 1, N):
cost = (i - start) * (1 + abs(A[start] - A[i]))
tmp = max(cost, solve(i)) # 최대 힘(K)
ret = min(ret, tmp) # K의 최솟값
dp[start] = ret
return dp[start]
answer = solve(0)
print(answer)
Reference
この問題について([BOJ]22871橋を渡る(大)), 我々は、より多くの情報をここで見つけました
https://velog.io/@ahj1592/BOJ-22871-징검다리-건너리-large
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
dp[x]
:x
からN-1
までのKKの最大値solve(x)
:dp[x]
の関数を求めます.再帰路実施コード#コード# import sys
#sys.stdin = open('input.txt', 'r')
sys.setrecursionlimit(int(1e5))
input = sys.stdin.readline
N = int(input())
A = list(map(int, input().split()))
dp = [-1 for _ in range(N)]
def solve(start):
# 시작과 목표가 같으면 0
if start == N - 1:
dp[start] = 0
return 0
# 이미 계산한 거리라면 바로 리턴
if dp[start] != -1:
return dp[start]
# 리턴값
ret = float('inf')
# start -> i -> (N - 1)
for i in range(start + 1, N):
cost = (i - start) * (1 + abs(A[start] - A[i]))
tmp = max(cost, solve(i)) # 최대 힘(K)
ret = min(ret, tmp) # K의 최솟값
dp[start] = ret
return dp[start]
answer = solve(0)
print(answer)
Reference
この問題について([BOJ]22871橋を渡る(大)), 我々は、より多くの情報をここで見つけました
https://velog.io/@ahj1592/BOJ-22871-징검다리-건너리-large
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
import sys
#sys.stdin = open('input.txt', 'r')
sys.setrecursionlimit(int(1e5))
input = sys.stdin.readline
N = int(input())
A = list(map(int, input().split()))
dp = [-1 for _ in range(N)]
def solve(start):
# 시작과 목표가 같으면 0
if start == N - 1:
dp[start] = 0
return 0
# 이미 계산한 거리라면 바로 리턴
if dp[start] != -1:
return dp[start]
# 리턴값
ret = float('inf')
# start -> i -> (N - 1)
for i in range(start + 1, N):
cost = (i - start) * (1 + abs(A[start] - A[i]))
tmp = max(cost, solve(i)) # 최대 힘(K)
ret = min(ret, tmp) # K의 최솟값
dp[start] = ret
return dp[start]
answer = solve(0)
print(answer)
Reference
この問題について([BOJ]22871橋を渡る(大)), 我々は、より多くの情報をここで見つけました https://velog.io/@ahj1592/BOJ-22871-징검다리-건너리-largeテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol