728x90

Total

728x90

    [2098번] 외판원 순회(TSP, 비트 마스킹)

    2098번: 외판원 순회 첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 16) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j www.acmicpc.net 외판원 순회 (모든 도시를 순회하는 최단 거리) n≤11일 경우: 브루트포스(O(n!)) n≤12일 경우: 백트래킹 n≤16일 경우: DP + BitMasking (n2∗2n) 분석 D[c][v] : 현재 도시 c, 현재까지 방문한 모든 리스트 v, 앞으로 남은 모든 도시를 경유하는데 필요한 최소비용 점화식 : D[c][v] = min(d[c][v], d[i][v|(1

    [11049번] 행렬 곱셈 순서 (행렬 곱 연산 횟수의 최솟값 구하기, DP)

    11049번: 행렬 곱셈 순서 첫째 줄에 입력으로 주어진 행렬을 곱하는데 필요한 곱셈 연산의 최솟값을 출력한다. 정답은 231-1 보다 작거나 같은 자연수이다. 또한, 최악의 순서로 연산해도 연산 횟수가 231-1보다 작거나 같 www.acmicpc.net 분석 풀이 import sys imput=sys.stdin.readline # 행렬의 갯수 n=int(input()) # 행렬 m=[] # 최소 연산 횟수 저장 리스트 d=[[-1 for j in range(n+1)] for i in range(n+1)] m.append((0,0)) for _ in range(n): x,y=map(int, input().split()) m.append((x,y)) def execute(s,e): result=sys.m..

    [9252번] 최장 공통 부분 수열 찾기(LCS)

    9252번: LCS 2 LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다. www.acmicpc.net LCS Longest Common Subsequence 분석 풀이 import sys input=sys.stdin.readline sys.setrecursionlimit(10000) a=list(input()) a.pop() b=list(input()) b.pop() # 점화식 테이블 d=[[0 for j in range(len(b)+1)] for i in range(len(a)+1)] # LCS 저장 리스트 re..

    [2193번] 이친수 구하기

    2193번: 이친수 0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다. 이친수는 0으로 시작하지 않 www.acmicpc.net 풀이1 """ 이진수 0으로 시작하지않음 1이 두번 연속으로 나타나지 않음. 11을 부분 문자열로 갖지않음 이친수 : 1, 10, 100, 101, 1000, 1001 이친수X : 0010101, 101101 N(1~90)자리의 이친수의 개수 구하기] """ import sys input=sys.stdin.readline n=int(input()) d=[[0 for i in range(2)] for j in range(n+1)] d[0][0]=0 # ..

    [1256번] 사전(수학, 조합)

    1256번: 사전 동호와 규완이는 212호에서 문자열에 대해 공부하고 있다. 김진영 조교는 동호와 규완이에게 특별 과제를 주었다. 특별 과제는 특별한 문자열로 이루어 진 사전을 만드는 것이다. 사전에 수록되 www.acmicpc.net 분석 n개의 "a", m개의 "z", k번째 문자열 출력 조합점화식 : dp[i][j] = dp[i-1][j]+dp[i-1][j-1] 현재 자릿수에서 a를 선택했을 때 남아 있는 문자들로 만들 수 있는 모든 경우의 수를 T라고 가정 나머지 문자열을 만들 수 있는 경우의 수 = D[남은문자 총개수][남은 z개수] T와 K를 비교해 문자 선택 T ≥ K : 현재 자리 문자를 a로 선택 T < K : 현재 자리 문자를 z로 선택하고, K-=T로 업데이트 N = 3, M = 2,..

    [1722번] 순열의 순서 구하기(수학, 구현)

    1722번: 순열의 순서 첫째 줄에 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄의 첫 번째 수는 소문제 번호이다. 1인 경우 k(1 ≤ k ≤ N!)를 입력받고, 2인 경우 임의의 순열을 나타내는 N개의 수를 입력받는다. N개의 수에는 1부터 N www.acmicpc.net 분석 4! = 24 3! = 6 2! =2 1! =1 제일 앞 자리에 사용할 수 있는 숫자 경우의 수 4가지, 다음 3가지, 다음 2가지, 다음 1가지 ➔ N자리의 수로 만들 수 있는 순열의 모든 경우의 수 N! 1. K번째 순열 출력 1) 로직 1. 주어진 값(K)과 현재자리(N) -1에서 만들 수 있는 경우의 수를 비교 2. 1에서 K가 더 작아질 때까지 경우의 수를 배수(cnt)로 증가시킴(순열의 순서를 1씩 늘림) 3. K가..