algorithm/problem solving 159

acmicpc.net 1967,1167(트리,DFS), 11725(트리,DFS), 1068(트리,DFS)

https://www.acmicpc.net/problem/1967 알면 간단하다. 어떤 한 점에서던지 가장 먼 노드의 거리를 구하면 그 노드는 가장 먼 두 점중 한 점이다. 그러니까 아무 점에서 시작해서 가장 먼 노드를 구한다. 그리고 그 노드에서 가장 먼 점의 거리를 구하면 그게 답이다. 아래 dfs함수에서 확인할수 있다. # -*- encoding: cp949 -*- def dfs(y): visited = [0 for i in xrange(10002)] s = [[y,0]] visited[y] = 1 max_weight,node = 0,1 while s: p = s.pop() if max_weight < p[1]: max_weight = p[1] node = p[0] for i in xrange(le..

acmicpc.net 1509,2079(DP, 팰린드롬), 13275(Manacher's Algorithm, 팰린드롬), 1990(소수,팰린드롬)

https://www.acmicpc.net/problem/1509, https://www.acmicpc.net/problem/2079 1. 글자들을 팰린드롬 이 가능한지 나눠준다. [x,y]범위에서 팰린드롬이 가능한지 설정해준다. 이것을 dp리스트에 저장해둔다. 2. 나눠진 팰린드롬을 나눈다. 이게 dp2리스트의 일이다. # -*- encoding: cp949 -*- import sys sys.setrecursionlimit(1000000) dp = [[0 for i in xrange(2502)] for j in xrange(2502)] dp2 = [0 for i in xrange(2502)] def divide(p): if p

acmicpc.net 11057(DP), 1937(DP), 10942(DP,팰린드롬)

https://www.acmicpc.net/problem/11057 기초 dp # -*- encoding: cp949 -*- n=input() dp = [[0 for i in xrange(10)] for i in xrange(1020)] for i in xrange(10): dp[0][i] = 1 for i in xrange(1,n+1): for j in xrange(10): for k in xrange(j,10): dp[i][j] += (dp[i-1][k]%10007) dp[i][j] %= 10007 print dp[n][0]https://www.acmicpc.net/problem/1937 bfs같이 보였었는데 bfs를 쓰면 시간초과난다. 첫 코드는 대나무의 크기 순서대로 정렬한 후 크기 순서대로 방문..

acmicpc.net 2573(BFS), 11967(BFS), 9328(BFS)

https://www.acmicpc.net/problem/2573 파이썬으로 코딩하니 시간초과가 나서 C++로 바꿨더니 됬다. 망할. #include #include using namespace std; int n,m; int _count; int _y[] = {1,0,-1,0}; int _x[] = {0,-1,0,1}; int temp_arr[301][301]; void bfs(int y, int x) { int visited[301][301]={0,}; queue q; q.push(make_pair(y,x)); while(!q.empty()) { int p0 = q.front().first; int p1 = q.front().second; q.pop(); for(int i=0;in-1 || tx>m-..

acmicpc.net 10868(세그먼트 트리), 2357(세그먼트 트리), 2268(세그먼트 트리)

https://www.acmicpc.net/problem/10868 http://qkqhxla1.tistory.com/734 의 세그먼트트리를 조금 변경한다. #include #include #include #include using namespace std; long long init(vector &a, vector &tree, int node, int start, int end) { if (start == end) { return tree[node] = a[start]; } else { return tree[node] = min(init(a, tree, node*2, start, (start+end)/2), init(a, tree, node*2+1, (start+end)/2+1, end)); } } ..

acmicpc.net 10827, 11060(DP), 1699(DP)

https://www.acmicpc.net/problem/10827 a^b를 어떻게 정확하게 구현할수 있을까? 소숫점을 없애고 큰 수 상태로 곱셈을 한다. 그 이후에 문자열로 만들어서 소수점 처리를 해주면 된다. # -*- encoding: cp949 -*- a,b=raw_input().split() p = len(a[a.index('.')+1:]) a = a.replace('.','') result = str(int(a)**int(b)) p=str((10**p)**int(b)) index = len(result)-len(p)+1 if index >=0: print result[:index]+'.'+result[index:] else: print '0.'+'0'*(-index)+resulthttps://..

acmicpc.net 피보나치 관련.

문제 카테고리 : https://www.acmicpc.net/problemset/?search=%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98 읽어볼것 : https://www.acmicpc.net/blog/view/28 몰랐던 코드. https://www.acmicpc.net/problem/2749 , https://www.acmicpc.net/problem/11444 를 풀기위한 코드. 행렬을 사용해서 하는거라함. n번째 피보나치 수를 구하는 코드. mod = 1000000 def gob(a,b): c = [[0,0],[0,0]] for i in xrange(2): for j in xrange(2): for k in xrange(2): c[i][j] += a[i][k] * b[k][..

acmicpc.net 9151,9252(LCS), 11758(CCW), 11437(LCA)

https://www.acmicpc.net/problem/9251, https://www.acmicpc.net/problem/9252 LCS 란 어떤 두 문자열의 '모든 부분 수열' 중에서 가장 긴 길이를 말한다. 앞에서 했던 suffix automaton과 비슷한거 같지만 suffix automaton은 접미사가 같은 것들중 가장 긴것을 구하는거고 (즉 연속해서 나와야 한다.) 이건 연속해서 나오지 않아도 된다. http://blog.naver.com/power2845/220677085876 참고. 아래는 9252번 소스. 9151은 r[0]만 출력. def LCS(a,b): ret = [] LCS_length = 0 s1='0'+a s2='0'+b table = [[0 for i in xrange(l..

acmicpc.net 1717(Disjoint-set), 11866,1158(조세퍼스 문제.)

https://www.acmicpc.net/problem/1717 기본 문제. cin,cout쓰면 시간초과가 걸리므로 printf, scanf를 쓰자. #include #include #include #include using namespace std; // 트리를 이용해 상호 배제적 집합을 구현한다. struct OptimizedDisjointSet { vector parent, rank; OptimizedDisjointSet(int n) : parent(n), rank(n, 1) { for(int i = 0; i < n; i++) parent[i] = i; } // u 가 속한 트리의 루트의 번호를 반환한다 int find(int u) { if(u == parent[u]) return u; retur..

acmicpc.net 5052(트라이), 9250(아호 코라식)

https://www.acmicpc.net/problem/5052 트라이를 이용하면 된다. 전화번호 목록을 받아서 긴 길이->짧은 길이 순으로 정렬한다. 그 후에 insert를 하기전에 이 전화번호가 다른곳에 포함되있는지 확인한다.#include #include #include #include #include #include #include #include using namespace std; const int ALPHABETS = 10; int toNumber(char ch) { return ch - '0'; } struct LinkedListNode { int elem; LinkedListNode* next; LinkedListNode(int _elem, LinkedListNode* _next) : ..

acmicpc.net 5582(Suffix Automaton), 9249, 9253(Suffix Automaton)

https://www.acmicpc.net/problem/5582 Suffix Automaton 문제. #include #include using namespace std; #define max(a,b) (a>b?a:b) const int MN = 270500; const int maxState = (MN id = size++; point->depth = dep; return point++; } void init() { point = pool; size = 0; root = sink = newState(0); } void insert(int a) { State *p = newState(sink->depth+1); State *cur = sink, *sufState; while (cur && !cur->g..

acmicpc.net 1927,11279,11286(힙), 11055(LIS), 1956(플로이드)

https://www.acmicpc.net/problem/1927 최소 힙. # -*- encoding: cp949 -*- from heapq import * h = [] for n in xrange(input()): x=input() if x==0: if len(h)==0: print 0 else: print heappop(h) else: heappush(h,x) https://www.acmicpc.net/problem/11279 위는 최소 힙. 이번문제는 최대 힙이다. 파이썬에는 최대 힙이 구현되어 있지 않다. 어떻게 할까..? 스택오버플로우에서 봤는데 어떤분이 '최소 힙을 사용하되, 숫자를 넣을때 -로 넣고 뺄때 -를 붙이면 최대 힙이 되!' 라는 답글을 보고 천재라고 생각했다..... # -*- ..

acmicpc.net 1671(네트워크 플로우), 2606(플로이드)

https://www.acmicpc.net/problem/1671 상어의 저녁식사. 처음에 그냥 그래프로 모델링해서 냈는데 실패했다. 어떤분이 문제 조건에 있는 a상어가 b상어를 먹고, 먹힌 b상어가 a상어를 다시 먹는 이상한 현상이 발생할수 있다고 해주셔서 생각을 해봤으나 안되서.. 질문했더니 능력치가 같은 상어가 있을 경우 나중의 상어가 현재의 상어를 못먹게끔 설정해주면 된다고 하셨다. #include #include #include #include using namespace std; const int MAX_X = 2005; const int MAX_V = 2005; int V; int capacity[MAX_X][MAX_V], flow[MAX_X][MAX_V]; int ability[MAX_X]..

acmicpc.net 1912(DP), 2293(DP), 2294(DP), 2156(DP)

https://www.acmicpc.net/problem/1912 기초적인 dp문제. # -*- encoding: cp949 -*- n = input() num = map(int,raw_input().split()) dp = num[:] dp[0] = num[0] for i in xrange(1,n): dp[i] = max(dp[i], dp[i-1] + num[i]) print max(dp) https://www.acmicpc.net/problem/2293 일반적인 dp문제중 하나. # -*- encoding: cp949 -*- n,k = map(int,raw_input().split()) coin = [0] + [input()for i in xrange(n)] dp = [0 for i in xrange..

acmicpc.net 2352,1365,12015,12738,2631,11722,3745(LIS(DP))

https://www.acmicpc.net/problem/2352 LIS를 구해주면 되는데 포트가 최대 40000개다. O(n^2)의 시간복잡도를 가지는 소스로는 시간 초과 에러가 뜨는데 lis는 최대 O(nlogn)으로 줄여줄 수 있다. 아래는 소스코드. #include #include #include using namespace std; int n,idx; int num; int arr[40001]; int main() { ios::sync_with_stdio(false); cin>>n; vector vt; vector::iterator itor; for(int i=0;i>arr[i]; vt.push_back(0); for(int i=0;i

acmicpc.net 11503,11568,1965(LIS(DP)), 2565(LIS(DP))

https://www.acmicpc.net/problem/11053 https://www.acmicpc.net/problem/11568 https://www.acmicpc.net/problem/1965 기본적인 LIS문제. 세개다 똑같은 소스로 해결된다. O(n^2)의 시간복잡도 #include #include #include using namespace std; int n; int cache[1001], S[1001]; int lis(int start) { int& ret = cache[start+1]; if(ret != -1) return ret; ret = 1; for(int next = start+1; next < n; ++next) if(S[start] < S[next]) ret = max(re..

acmicpc.net 1992(분할 정복), 11729(분할 정복), 1780(분할 정복)

https://www.acmicpc.net/problem/19924개로 분할하여 푼다. # -*- encoding: cp949 -*- import sys def quad(x1, y1, x2, y2): flag = False #print 'h =',x1,y1,x2,y2, for i in xrange(y1, y2+1): for j in xrange(x1, x2+1): if maps[y1][x1] != maps[i][j]: flag = True break if flag: break if not flag: #print 'here =',x1,y1,maps[y1][x1] sys.stdout.write(maps[y1][x1]) if flag: h_x = (x1+x2)/2; h_y = (y1+y2)/2 sys.stdo..

acmicpc.net 2098(TSP), 10971(2098과 동일)

https://www.acmicpc.net/problem/2098, https://www.acmicpc.net/problem/10971 유명한 TSP문제. dp와 더불어 비트마스크도 써야 한다. 문제에 안써있는데 1번 도시부터 출발해서 돌아오는 경우로 해야 한다. 1. 마을을 방문했다는 뜻의 visited변수는 정수 하나다.(리스트 아님.) visited변수의 비트를 이용해서 방문했는지 표시를 한다. ex) visited가 1이면 이진수로 1이므로 1번 도시를 방문했다. visited가 3이면 이진수로 11이므로 1,2번 도시를 방문했다. ... visited가 (2의n승)-1이면 이진수로 1111~~1111 이므로 1~n번까지 도시를 전부 방문했다라고 해석할수 있다. ex) n==4일경우 (2의4승-1..

acmicpc.net 11375(이분 매칭), 11376(이분 매칭), 11377(이분 매칭)

https://www.acmicpc.net/problem/11375 기본적인 이분 매칭 #include #include #include #include using namespace std; const int MAX_N = 1001; const int MAX_M = 1001; int n, m; bool adj[MAX_N][MAX_M]; vector aMatch, bMatch; vector visited; bool dfs(int a) { if(visited[a]) return false; visited[a] = true; for(int b = 0; b < m; ++b) if(adj[a][b]) if(bMatch[b] == -1 || dfs(bMatch[b])) { aMatch[a] = b; bMatch[b]..