목록ALGORITHM (123)
MY MEMO
일단 이 문제를 보고 처음 든 생각은 바로 한칸을 뛰거나 아니면 두칸을 뛰고 대신 3개를 연속으로 뛰지 않는 문제를 생각했다.그래서 첫번째 코드를 짰다. 첫번째 실패#include #include #include #include using namespace std; int cup_count, drinking_amount; vectoralchol; void drinking_wine(int index, int before_flag, int result) { if (index >= cup_count) { drinking_amount = max(result, drinking_amount); return; } if (before_flag < 2) //만약 이전에 한칸 뛰었으면 { drinking_wine(inde..
이게 원래 짰던 코드이다만약 3자리 수라면 100이고 111까지만 확인하면 된다 왜냐하면000부터 011까지는 0이 맨 앞에 있기 때문에 어짜피 되지 않는다. 따라서 cache를 두고 x는 자릿 수 y는 decimal숫자로 해서만약 2자리수의 decimal 3을 미리 구해놓았다면되는지 되지 않는지를 판단하는 것이다. 하지만 문제가 있었다이것이 범위는 90자리 즉 pow(2,90)인 것이다.vector로 저 범위의 공간을 만들 수가 없다. #include #include #include #include #include using namespace std; vector cache = vector(91, vector(pow(2, 20), -1)); string dec_to_bin(unsigned long lo..
오류 코드#include #include #include #include using namespace std; vector cache; #define INT_MAX 2147483647 int cal(int remain, int result) { if (remain == 1) return result-1; int &ret = cache[remain]; if (ret != INT_MAX) return ret; if (remain % 3 == 0) ret = min(ret, cal(remain / 3, result + 1)); if (remain % 2 == 0) ret = min(ret, cal(remain / 2, result + 1)); ret = min(ret, cal(remain - 1, result..
#include #include #include using namespace std; int sum_sub; vectormain_cache = vector(10001, vector(10001, 0)); //cache : x => 그룹을 지을 노드의 수, y => 나눠야하는 그룹의 개수 //group_count : 나눠야하는 그룹의 개수 //pre_node_count : 그룹을 지을 노드의 수 //pre_group : 현재 나눈 그룹의 수 int main_tree(int group_count, int pre_node_count, int pre_group) { // 현재 노드가 0이고 모든 그룹을 짝지었다면 (모든 그룹을 짝지은후 한번더 DP를 돌림) 현재 그룹이 모든 그룹의 수보다 크다 // 그렇다면 1개..
정답 코드 이 문제는 최소 스패닝 트리로 푸는 문제이다.최소 스패닝 트리를 간단히 설명하자면1. 최소 거리를 순서대로 저장해 놓는다2. 만약 그 거리를 연결했을 때 사이클이 돈다면 설정하지 않는다3. 사이클이 돌지 않는다면 연결시키고 결과 값에 더해준다. #include #include #include #include #include using namespace std; #define PAIR pair vector parent; int find(int index) { if (index == parent[index]) return index; else return parent[index] = find(parent[index]); } int Union(int start, int end) { start = f..
http://book.algospot.com/estimation.html
start_end 배열은 prodo가 있는 곳부터 시작해서 종료 까지 막대 경로를 저장해 놓은 것이다end_start 배열은 ring이 있는 곳부터 시작해서 종료까지 가는 막대 경로를 저장해 놓은 것이다. 경로는 어떻게 찾냐면 한 막대에 갈수 있는 방향은 오른쪽과 왼쪽이다그렇다면 자신의 막대에 -1을 한 곳에 막대가 있다면 왼쪽으로 이동즉 자신의 막대 -1자신의 막대에 +1을 한 곳에 막대가 있다면 오른쪽으로 이동즉 자신의 막대 +1 만약 start_end의 레벨이 n이라면 end_start배열의 레벨이 n+1일때두개의 차이가 1이면 가능하다 (단 하나의 stick만 놓아서 되야 하므로) #include #include #include using namespace std; int main() { int ..
#include #include #include #include #include #include using namespace std; int result, rap_count; string rap; vector alpha; void singing(int index, int rap_result) { if (index == rap_count) { result = max(result, rap_result); return; } int count = 0; while (index + count < rap_count) { count++; string temp = rap.substr(index, count); int sub_index = index + count - 1; while (1) { sub_index = alp..
#include #include #include #include #include #include #include using namespace std; #define PAIR pair int main() { int for_count, house_count, trash_count; cin >> for_count; for (int k = 1; k > house_count >> trash_count; if (trash_count >= house_count) { cout
1. 평균값이 들어온다 (0 최소를 만들기 위하여4. 5부터 나눈후 몫을 저장하고 나머지를 돌린다.5. 만약 값이 현재의 값 보다 작다면 현재의 값을 1빼준다6. 나누는 값이 0이 될때까지 반복한다 14.3점이 나왔다.이유는..모르겠다..ㅠㅠ #include #include #include #include #include #include #include using namespace std; double average; int result, i; vector dice; long long gcd(long long a, long long b) { if (b == 0) return a; return gcd(b, a%b); } int main() { int for_count; cin >> for_count; fo..