CS/λ°±μ€€

[λ°±μ€€ c++] 2579 계단 였λ₯΄κΈ° (μ‹€3)

κ°•μ˜μ„œ 2022. 2. 10. 00:36

πŸ“Œ μ„œλ‘ 

이 λ¬Έμ œλŠ” λ‚΄κ°€ μ•Œκ³ λ¦¬μ¦˜ μŠ€ν„°λ””λ₯Ό μ—΄μ‹¬νžˆ ν–ˆμ„ λ•Œ ν’€μ—ˆλ˜ λ¬Έμ œλ‹€

κ°„λ‹¨ν•˜λ©΄μ„œλ„ λ™μ ν• λ‹Ήμ˜ κ°œλ…μ„ 잘 얻을 수 μžˆλŠ” 쒋은 문제!

 

이 λ¬Έμ œλŠ” 사싀 동적 κ³„νš 이외에 μž¬κ·€ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ ν’€ μˆ˜λ„ μžˆμ§€λ§Œ κ·Έλ ‡κ²Œ ν‘Όλ‹€λ©΄

μ‹œκ°„ 초과 문제둜 λ§žμ„ 수 μ—†μ—ˆλ‹€.

 

πŸ™…πŸ»‍♂️ ν‹€λ¦° λ‹΅μ•ˆ

#include <iostream>
using namespace std;

int N;
int MAX;
int* stair;
int result;

void function(int idx, int nextCnt) {
	
	if (idx == N - 1 ) {
		if (nextCnt == 2) return;
		if (MAX < result + stair[idx]) MAX = result + stair[idx] ;
	}
	else if(nextCnt != 2){
		result += stair[idx];
		if (nextCnt != 2) 	//1μΉΈμœ„λ‘œ μ˜¬λΌκ°€κ³  싢은데 λ¨Όμ € 확인
			function(idx + 1, nextCnt + 1);
		if (idx + 2 < N) 
			function(idx + 2, 0);
		result -= stair[idx];
	}

}

int main() {

	cin >> N; if (N < 1 || N > 300) return 0 ;
	stair = new int[N];
	for (int i = 0; i < N; i++) cin >> stair[i];
	MAX = 0; result = 0;

	function(0,0);
	function(1,0);

	cout << MAX << endl;

	return 0;
}

μž¬κ·€λ₯Ό μ‚¬μš©ν•œ μ½”λ“œμ΄λ‹€.

λͺ¨λ“  κ°€λŠ₯성을 λ‹€ νƒμƒ‰ν•œ ν›„ κ°€μž₯ μ΅œλŒ€κ°’μ΄ λ‚˜μ˜€λŠ” 경우λ₯Ό μ°ΎλŠ” 방법인데 μ΄λ ‡κ²Œ ν•˜λ©΄ μ•„λž˜μ™€ 같이 μ‹œκ°„μ΄ˆκ³Ό 결과둜

문제λ₯Ό ν’€ 수 μ—†λ‹€.

 

 

동적 κ³„νšλ²• ( λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° ) 에 λŒ€ν•΄μ„œ μ•Œμ•„μ•Ό 문제의 해닡을 찾을 수 μžˆλ‹€.

βœ¨λ™μ κ³„νšλ²• κ΄€λ ¨ κΈ€ μ°Έκ³  https://greedy-blow-you-away12.tistory.com/8

 

πŸ’» μ •λ‹΅ μ½”λ“œ

#include <cstdio>
using namespace std;
int max(int a, int b) { return a > b ? a : b; }
int main () {
    int n, i;
    int arr[300];
    int dp[300];
    scanf("%d", &n); for (i = 0; i < n; i++) scanf("%d", &arr[i]);
    dp[0] = arr[0];
    dp[1] = max(arr[0]+arr[1], arr[1]);
    dp[2] = max(arr[0]+arr[2], arr[1]+arr[2]);
    for (i = 3; i < n; i++) dp[i] = max(dp[i-2] + arr[i], dp[i-3] + arr[i-1] + arr[i]);
    printf("%d\n", dp[n-1]);
    return 0;
}

 

 

⏱ 결과