πŸ‹ 문제링크


11048번: μ΄λ™ν•˜κΈ°

🍎 μ½”λ“œ 제좜 기둝 (λ©”λͺ¨λ¦¬ 및 μ‹œκ°„)


λ©”λͺ¨λ¦¬ : 37064KB

μ‹œκ°„ : 1000ms

πŸ‰ Code


import sys
input = sys.stdin.readline

N, M = map(int, input().split())
dp = [[0] * (M + 1)] * (N + 1)
candy = []

for i in range(N):
    candy.append(list(map(int, input().split())))

for i in range(1, N+1):
    for j in range(1, M+1):
        dp[i][j] = max(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + candy[i-1][j-1]

print(dp[N][M])
#include <iostream>
#include <algorithm>

int N, M;
int dp[1001][1001];
int candy[1001][1001];

void input_faster()
{
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);
}

void input()
{
	std::cin >> N >> M;
	for (int i = 1 ; i <= N ; i++)
		for (int j = 1; j <= M ; j++)
			std::cin >> candy[i][j];
}

void solve()
{
	for (int i = 1 ; i <= N ; i++)
		for (int j = 1 ; j <= M ; j++)
			dp[i][j] = std::max(std::max(dp[i - 1][j - 1], dp[i - 1][j]), dp[i][j - 1]) + candy[i][j];
}

void print_val()
{
	std::cout << dp[N][M];
}

int main()
{
  input_faster();
	input();
	solve();
	print_val();
	return (0);
}

πŸ₯ λ©”λͺ¨


<문제 μ ‘κ·Ό>

dp[N][M] λ₯Ό ꡬ할 수 μžˆλŠ” 경우의 μˆ˜λŠ” 총 3κ°€μ§€λ‘œ

μœ„μ˜ 경우 듀을 λͺ¨λ‘ κ΅¬ν•΄μ„œ κ·Έ μ€‘μ˜ κ°€μž₯ 큰 값을 dp[N][M]둜 κ²°μ •ν•˜λ©΄ λœλ‹€