Link https://www.acmicpc.net/submit/5557/14656614
소스결과 2004 KB / 0 ms
출처 Baekjoon
언어 C++ 71
분류 다이나믹프로그래밍
설명
0 ~ 20밖에 모르는 상근이의 엄청난 도전을 응원하며 몇개의 올바른 등식을 만들 수 있는지 확인하자
브루트포스로 당연히 안되는걸 알면서 도전은 해보았다. 결과적으로 바로 시간초과가 나오긴한다.
최대 범위가 20이라 다행이다.
모든 경우에 대해서 n번째 위치에서 올바른 값으로 등록이 되는지를 더해주면된다.
알고리즘
1. 첫항 - 0번을 1로 초기화한다.
2. 두번째 항 - 1번을 기준으로 + - 를 진행하여 각 경우에 대해서 이전 항 - 이전 시도 를 더해준다.
3. 모든 항에 대해서 반복 후 마지막 항 - n번 에 대한 값을 출력한다.
소스코드
#include <iostream>
using namespace std;
const short RAN_MIN = 0;
const short RAN_MAX = 20;
const int MAX = 100;
typedef long long ll;
int numbers[MAX];
ll dp[MAX + 1][RAN_MAX + 1];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n; cin >> n;
for (int i = 0; i < n; i++)
cin >> numbers[i];
dp[0][numbers[0]] = 1;
for (int i = 1; i < n; i++)
for (int j = 0; j < RAN_MAX + 1; j++) {
if (dp[i - 1][j]) {
if (j + numbers[i] <= RAN_MAX) dp[i][j + numbers[i]] += dp[i - 1][j];
if (j - numbers[i] >= RAN_MIN) dp[i][j - numbers[i]] += dp[i - 1][j];
}
}
cout << dp[n - 2][numbers[n - 1]];
return 0;
}
'Algorithm > Dynamic Programming' 카테고리의 다른 글
Baekjoon 3908 서로 다른 소수의 합 (0) | 2019.11.11 |
---|---|
Baekjoon 17291 새끼치기 (0) | 2019.08.21 |
Baekjoon 5573 산책 (0) | 2019.08.19 |
Baekjoon 5569 출근경로 (0) | 2019.08.19 |
Baekjoon 1964 오각형, 오각형, 오각형... (0) | 2019.04.01 |