관리 메뉴

너와 나의 스토리

[BOJ] 5557 1학년 본문

Algorithm/Dynamic Programming

[BOJ] 5557 1학년

노는게제일좋아! 2020. 5. 16. 21:04
반응형

문제: https://www.acmicpc.net/problem/5557

 

문제 풀이:

 

주목할 조건

1. 중간 연산 결과가 [0, 20] 사이의 값이어야 한다.

2. 각 값은 [0, 9] 사이의 값이다.

3. 올바른 등식의 개수는 $2^63-1$ 이하이다. -> long long 사용해야 한다.

 

dp[index][현재까지의 값]=경우의 수 

로 dp를 만들고, 2중 포문으로 문제를 풀 수 있다.

 

소스 코드:

더보기
#include <iostream>
#include <cmath>
#include <algorithm>
#include <string>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>

using namespace std;

typedef long long ll;
int n,arr[102];
ll dp[102][21];


int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}
	dp[0][arr[0]] = 1;
	for (int i = 1; i < n-1; i++) {
		for (int j = 0; j <= 20; j++) {
			if(j-arr[i]>=0) dp[i][j - arr[i]] += dp[i - 1][j];
			if(j+arr[i]<=20) dp[i][j + arr[i]] += dp[i - 1][j];
		}
	}
	cout << dp[n - 2][arr[n - 1]] << '\n';
	return 0;
}
반응형
Comments