저희 학교 알고리즘 과목에 첫 번째 과제로 피보나치킨이 등장했습니다. 입력 제한이 3억일 때, 피보나치 배열을 어느 제한까지 구해야 하는지, 배열 인덱싱과 stringToint의 형 변환 등 다양한 요소가 포함되어 있습니다. 단순 구현으로 풀이해도 되지만, 다양한 풀이법이 존재하고 피보나치수열과 제켄도르프 정리는 상당히 흥미로운 내용이기 때문에 소개해 드리려고 합니다. 코드는 모두 올리진 않겠습니다. 학교 과제 내용이기도 해서.. 1. DP를 이용한 풀이 방법 가장 일반적인 방법입니다. f(n)=f(n-1)+f(n-2) 라는 간단한 점화식을 활용해 피보나치 수를 구한 다음, n보다 작지만 가장 큰 피보나치 수를 빼며 그 인덱스를 치킨 합에 더해주고 n에 피보나치 수를 빼고 n을 0으로 만들면 종료합니다...
// d is the number of characters in the input alphabet #define d 29 //find txt in pattern int RCsearch(const string& pattern , const string& txt, int q = 100003) { int M = pattern.size(), N = txt.size(); int p = 0; // hash value for pattern int t = 0; // hash value for txt int h = 1; for (int i = 0; i < M - 1; i++) h = (h * d) % q; for (int i = 0; i < M; i++){ p = (d * p + pattern[i]) % q; t = (..
int ccw(pair a, pair b, pair c) { int op = a.first*b.second + b.first*c.second + c.first*a.second; op -= (a.second*b.first + b.second*c.first + c.second*a.first); if (op > 0)return 1; else if (op == 0)return 0; else return -1; } bool isIntersect(pair x, pair y) { pair a = x.first; pair b = x.second; pair c = y.first; pair d = y.second; int ab = ccw(a, b, c)*ccw(a, b, d); int cd = ccw(c, d, a)*cc..
typedef long long ll; ll cache[MAX_N][MAX_N]; //use dp ll comb(int n,int r) { if(r==0||n==r)return 1; ll&ret=cache[n][r]; if(ret!=-1)return ret; return ret=comb(n-1,r-1)+comb(n-1,r); } //if n is small ll comb(int n,int r) { if(r==0||n==r)return 1; return comb(n-1,r-1)+comb(n-1,r); } nCr=(n-1)C(r-1)+(n-1)Cr 점화식을 이용한 간단한 재귀함수이다. 경우의 수의 특성상 수가 조금만 커져도 int범위를 간단히 넘어버리니 왠만한 경우에는 long long 을 선언해서 풀어주어..