Algorithm/DP

BOJ#12969 ABC

밤이2209 2017. 4. 5. 03:42

BOJ#12969 ABC


* 문제


* 풀이

풀이는 코드 주석으로 대신합니다.


- 참고한 블로그 : https://fullalgorithmpanic.blogspot.kr/search?q=12969



* 나의 코드

https://github.com/stack07142/BOJ/blob/master/BOJ%2312969_ABC/src/Main.java


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/**
* BOJ#12969 ABC
* https://www.acmicpc.net/problem/12969
*/

/**
* dp[x][a][b][k] : x번째까 A의 개수가 a, B의 개수가 b일 때,
* S[i] < S[j]를 만족하는 쌍의 개수가 k인 문자열이 존재하는지 검사 여부
* 1) x번째 원소가 A인 경우 : dp[x+1][a+1][b][p];
* 2) x번째 원소가 B인 경우 : dp[x+1][a][b+1][p+a];
* 3) x번째 원소가 C인 경우 : dp[x+1][a][b][p+a+b];
*/

public class Main {

static final int NOT_EXIST = -1;
static boolean[][][][] dp = new boolean[31][31][31][436];
static char[] S;
static int N, K;

public static void main(String[] args) throws IOException {

// input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());

N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());

S = new char[N];

// solve
if (solve(0, 0, 0, 0)) {

System.out.println(new String(S));
} else {

System.out.println(NOT_EXIST);
}
}

/**
* 정수 N, K가 주어졌을 때, 다음 조건을 만족하는 문자열 S가 존재하는지 여부를 판단하는 함수
* 조건#1 : 문자열 S의 길이는 N이고, 'A','B','C'로 이루어져 있다.
* 조건#2 : 문자열 S에는 0 <= i < j < N이면서, S[i] < S[j]를 만족하는 쌍이 K개가 있다.
*/
static boolean solve(int x, int a, int b, int p) {

// 종료 조건
if (x == N) {

if (p == K) return true;
else return false;
}

// 방문했었지만, 다시 방문했다면 해당 문자열이 없는 것이다. return false;
if (dp[x][a][b][p]) return false;
// 방문 여부 체크
dp[x][a][b][p] = true;

// 1. x번째 원소가 A인 경우
S[x] = 'A';
if (solve(x + 1, a + 1, b, p)) return true;

// 2. x번째 원소가 B인 경우
S[x] = 'B';
if (solve(x + 1, a, b + 1, p + a)) return true;

// 3. x번째 원소가 C인 경우
S[x] = 'C';
if (solve(x + 1, a, b, p + a + b)) return true;

return false;
}
}




'Algorithm > DP' 카테고리의 다른 글

BOJ#11048 이동하기  (0) 2017.04.06
BOJ#11058 크리보드  (2) 2017.04.05
BOJ#13398 연속합2  (1) 2017.04.04
BOJ#1520 내리막 길  (0) 2017.03.31
BOJ#13460 째로탈출 2  (0) 2017.03.31