Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 그리디
- DP
- 백준
- 재귀함수
- 재귀
- 26008
- 스택
- Flutter
- 크로스핏
- 서울에서경산까지
- 15353
- 15662
- 1781
- BOJ
- 1로만들기2
- dart
- 회전하는큐
- Python
- 삼성
- 해시해킹
- 브루트포스
- Crossfit
- spring boot
- BOJ14889
- 4811
- 동적프로그래밍
- 14863
- D1
- sw expert academy
- C++
Archives
- Today
- Total
곧죽어도 콛잉
[DP (동적 프로그래밍) / BOJ 4811 / C++] 알약 본문
https://www.acmicpc.net/problem/4811
4811번: 알약
입력은 최대 1000개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄이며, 병에 들어있는 약의 개수 N ≤ 30 가 주어진다. 입력의 마지막 줄에는 0이 하나 주어진다.
www.acmicpc.net
이번 문제도 전형적인 dp문제. 상태값을 잘 생각해보면 2가지.
병안에 한조각 짜리 개수와, 병안에 반조각짜리 개수를 기준으로 세가면 끝.
종료 조건은 병안에 한조각짜리도, 반조각짜리도 없으면 즉시 종료!
W,H에 흔들리지 말고 직접 경우의 수를 완전탐색 방식으로 몇개만 세봐도 간단하게 해결된다
현재 상태에서 1번 선택 혹은 2번 선택을 이어나간다. 즉 종료조건에 도달할때는 그 경로가 유일하다!!
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll N, dp[31][61];
ll go(ll n1, ll n2){ // n1 : 병안에 한조각짜리 개수 n2 : 병안에 반조각짜리 개수
if(n1 < 0 || n2 < 0) return 0;
if(n2==0 && n1==0) return 1;
ll &mid = dp[n1][n2];
if(mid!=-1) return mid;
// 한조각 꺼내고 쪼개서 먹기 vs 반조각먹기
ll oneAndHalf = go(n1-1, n2+1);
ll onlyHalf = go(n1, n2-1);
mid = oneAndHalf + onlyHalf;
return mid;
}
int main(){
memset(dp, -1, sizeof(dp));
while(true){
cin >> N;
if(N==0) break;
cout << go(N, 0) << '\n';
}
return 0;
}
'Coding Test > C++' 카테고리의 다른 글
[그리디 / BOJ 1541 / C++] 잃어버린 괄호 (0) | 2023.08.16 |
---|---|
[DP (동적 프로그래밍) / BOJ 12852 / C++] 1로 만들기 2 (0) | 2023.08.12 |
[DP (동적 프로그래밍) / BOJ 2342 / C++] Dance Dance Revolution (0) | 2023.08.06 |
[DP (동적 프로그래밍) / BOJ 14863 / C++] 서울에서 경산까지 (0) | 2023.08.06 |
[LIS (가장 긴 증가하는 부분 수열) / BOJ 11053 / C++] 가장 긴 증가하는 부분 수열 (0) | 2023.08.02 |
Comments