https://www.acmicpc.net/problem/12970
12970번: AB
첫째 줄에 문제의 조건을 만족하는 문자열 S를 출력한다. 가능한 S가 여러 가지라면, 아무거나 출력한다. 만약, 그러한 S가 존재하지 않는 경우에는 -1을 출력한다.
www.acmicpc.net
[난이도] Gold4
[유형] DP
[풀이]
dp[n][a][k] : 앞에서부터 n개의 문자를 배치했고, A의 개수가 a개이며, AB쌍의 수의 k개일 때, 정답 문자열을 만들 수 있는지 여부 (1:ok,0:no,-1:아직 체크안됨)
A를 추가하는 경우 => sol(n+1,a+1,k) 이 1이면 문자열을 만들 수 있으므로 정답 문자열에 'A'를 추가,
B를 추가하는 경우 => sol(n+1,a,k+a) 이 1이면 문자열을 만들 수 있으므로 정답 문자열에 'B'를 추가하는
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int N,K,dp[50][50][13000];
string r;
int sol(int n,int a,int k){
if(n==N) return k==K;
int& ret = dp[n][a][k];
if(ret!=-1) return ret;
int b = n-a;
if(sol(n+1,a+1,k)){
r = 'A' + r;
return ret=1;
}
if(sol(n+1,a,k+a)){
r = 'B' + r;
return ret=1;
}
return ret=0;
}
int main(){
cin >> N >> K;
memset(dp,-1,sizeof(dp));
sol(0,0,0);
if(r=="") cout << -1;
else cout << r;
}
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold4/12970.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Gold4] 13422 : 도둑 (C++) (0) | 2021.02.14 |
---|---|
[BOJ/백준][Gold4] 20058 : 마법사 상어와 파이어스톰 (C++) (0) | 2021.02.14 |
[BOJ/백준][Gold4] 2550 : 전구 (C++) (0) | 2021.02.14 |
[BOJ/백준][Gold4] 3908 : 서로 다른 소수의 합 (C++) (0) | 2021.02.06 |
[BOJ/백준][Gold4] 20040 : 사이클게임 (C++) (0) | 2021.02.06 |