백준/DP

[백준 5557번 / C++] 1학년

배발자 2022. 2. 22.
반응형

DP를 활용한 문제이다. 

 

#접근방법 

  1. 입력할 수 있는 개수 최대 100과 최대 sum값을 20을 가지기 때문에 dp[101][21] 배열 생성. 
  2. 등호를 붙여야 하는 (index-2) 위치에 도달 할 때까지 dfs방식으로 호출한다. ("- 연산", "+ 연산" )

    - sum값이 0보다 작거나 20보다 크면 return 0

    - 이미 메모이제이션이 되있는 경우 해당 값을 return

    - (index-2) 위치에 도달했을 때 마지막값과 sum값이 같으면 return 1 (카운트) 

   

#include <iostream>
using namespace std; 
typedef long long ll; 
int n;
ll dp[101][21]; 
ll d[101];
ll go(int idx, int sum) {
	if (sum < 0 || sum>20)return 0; 
	ll& ret = dp[idx][sum]; 
	if (ret)return ret; 	
	if (idx == n - 2) {
		if (sum == d[n - 1]) {
			return 1;
		}
		return 0; 
	}
	ret += go(idx + 1, sum + d[idx+1]); 
	ret += go(idx + 1, sum - d[idx+1]); 
	return ret; 
}
int main() {
	cin >> n; 
	for (int i = 0; i < n; i++) {
		cin >> d[i]; 
	}
	cout << go(0, d[0]); 
	return 0; 
}
 

5557번: 1학년

상근이가 1학년 때, 덧셈, 뺄셈을 매우 좋아했다. 상근이는 숫자가 줄 지어있는 것을 보기만 하면, 마지막 두 숫자 사이에 '='을 넣고, 나머지 숫자 사이에는 '+' 또는 '-'를 넣어 등식을 만들며 놀

www.acmicpc.net

반응형

'백준 > DP' 카테고리의 다른 글

[백준 11052번 / C++] 카드 구매하기  (0) 2022.03.08
[백준 1520번 / C++] 내리막 길  (0) 2022.02.24
[백준 1149번 / C++] RGB거리  (0) 2022.02.17
[백준 12869번 / C++] 뮤탈리스크  (1) 2022.02.09
[백준 1450번 / C++] 냅색문제  (0) 2022.01.26

댓글