https://www.acmicpc.net/problem/2805
이분 탐색으로 찾는다.
n,m=map(int,raw_input().split()) tree = map(int,raw_input().split()) l,h = 0,1000000000 while l < h: mid = (l+h)/2 s = 0 bl,bh = l,h for i in xrange(n): if tree[i] > mid: s += tree[i]-mid if s >= m: l = mid else: h = mid if bl==l and bh==h: break print l
https://www.acmicpc.net/problem/9184
괜찮은 문제 중 하나라고 생각한다. 재귀함수가 있을때 이것을 메모이제이션 하는 방법을 묻는 문제이다.
기초적이지만 유용하다고 생각한다.
# -*- encoding: cp949 -*- def w(a,b,c): if a <= 0 or b <= 0 or c <= 0: return 1 if a > 20 or b > 20 or c > 20: dp[20][20][20] = w(20, 20, 20) return dp[20][20][20] ret = dp[a][b][c] if ret!=0: return ret if a < b and b < c: dp[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c) return dp[a][b][c] dp[a][b][c] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1) return dp[a][b][c] while True: dp = [[[0 for k in xrange(40)] for j in xrange(40)] for i in xrange(40)] a,b,c = map(int,raw_input().split()) if a==b==c==-1: break print 'w({}, {}, {}) = {}'.format(a,b,c,w(a,b,c))
https://www.acmicpc.net/problem/2688
쉽다.... 앞의 쉬운 계단수였나 그 문제랑 똑같다.
# -*- encoding: cp949 -*- dp = [[0 for j in xrange(10)] for i in xrange(65)] for i in xrange(10): dp[1][i] = 1 for i in xrange(2,65): for j in xrange(10): dp[i][j] += sum(dp[i-1][j:]) for t in xrange(input()): n=input() print sum(dp[n])
'algorithm > problem solving' 카테고리의 다른 글
acmicpc.net 13565(BFS,DFS), 1261(다익스트라) (0) | 2016.11.27 |
---|---|
acmicpc.net 1918(스택,후위표기식), 1935(스택,후위표기식) (0) | 2016.11.20 |
acmicpc.net 1254(DP, 팰린드롬), 1695,5502(DP, 팰린드롬), 11203(이진 트리) (0) | 2016.11.12 |
acmicpc.net 2011(DP), 2240(DP), 2666(DP), 2624(DP) (0) | 2016.11.11 |
acmicpc.net 1480(배낭 문제, DP, 비트마스크), 5557(DP, 조합), 2630(분할 정복) (0) | 2016.11.09 |