본문 바로가기

학교공부/알고리즘

(4)
분기한정법 Branch-and-Bound 백트래킹과 같이 상태공간트리를 구축해서 해결 최적의 해를 구하는데 사용 어차피 다 확인해봐야해서 dfs 든 bfs든 상관없음(백트래킹은 dfs) 분기한정 알고리즘 원리 현재 있는 마디가 유망한지(promising)한지의 여부를 bound를 통해 결정한다. bound는 그 가지의 해답값의 한계를 나타낸다. 간단한 그림으로 분기한정법의 예시를 나타낸다. A와 B의 코스의 최소거리가 팻말에 나타나 있다. 이런 경우 당연히 A와 B는 고려하지 않는다(not-promising) 이런 경우에는 A를 먼저 탐색하는게 효율적이다. A에서의 최적의 해가 200이하면 B는 갈 필요 없기 때문 그렇다면 이 방법을 배낭채우기 문제에 적용해보자. 배낭에 채울 수 있는 최대 무게가 W 라고하자 n개의 아이템의 가격이 p 무게가 ..
백준 #1541 괄호를 잘쳐서 최소값으로 만드는 문제. -를 만나면 다음 -를 만날때까지 괄호를 치는게 최적의 해이다. 원래는 그리디 알고리즘으로 정당성을 증명해야하지만 그냥 직관적으로 봐도 자명한 사실이라 생략한다. import sys fomula = list(map(str,sys.stdin.readline().split('-'))) def listsum(lst): lst1=str(lst).split('+') sum = 0 for i in lst1: sum+=int(i) return sum sum = 0 sum +=listsum(fomula[0]) for i in range(1,len(fomula)): sum-=listsum(fomula[i]) print(sum) 파이썬에는 신기하고 편리한 방법이 많은거같다.
백준 #1931 문제풀이는 세가지로 생각할수 있다. 시작시간이 빠른 순서대로 끝나는 시간이 빠른 순서대로 시작과 끝의 차이가 작은 순서대로 1,3은 간단히 생각해도 반례가 존재해서 2번으로 풀어야 할 것 같다. 2번 방법에 대한 최적여부를 검증해보자. 첫번째는 종료시간이 빠른 값이 최적해에 포함됨을 증명하는 것이다. 종료시간과 관계없는 최적해 S가 있다고 가정하자. 만약 S[0]을 빼고 종료시간이 빠른 값을 넣는다면 S >= S'이므로 귀류법으로 증명 가능하다. 두번째는 최적 부분 구조의 속성이다. 부분에서 최적해를 구하는것이 전체 최적해임을 증명해야한다. 근데 이건 문제 특성상 하나를 선택했을 때 그 나머지를 선택하는데 영향을 주지 않으므로 당연하게 알 수 있다. 이 둘을 합치면 첫번째 선택을 할 때 종료시간이 빠른 ..
신장트리 최소비용 탐색 신장트리(spanning tree) 모든 정점을 포함하면서 사이클이 없는 트리 (트리의 조건) 목표 그리디(Prim, Kruskal) 알고리즘으로 mst(최소비용신장트리) 찾아보자 알고리즘의 최적의 여부를 검증해보자 그리디 알고리즘 결정 순간마다 가장 좋다고 생각되는 것을 해답으로 선택 선택은 그 당시(local)에는 최적이나 최종적인 선택(global)은 최적이라는 보장 없음, 검증 필수 Prim의 알고리즘 개념 집합에 속한 정점 중에서 가장 가까운 정점을 반복에서 추가하는 방법 처음 노드를 v1으로 선택했다고 하자 (랜덤으로 해도 상관없음) 순서 안보임 경계 결과집합 1 V4,V5 V2,V3 V1 2 V5 V3,V4 V1,V2 3 null V4,V5 V1,V2,V3 4 null V4 V1,V2,V3,..