Line (A) å j a k= i k #define max(a, b) (((a) >= (b))? (a) : (b)) long MaxSubseqSum0(int A[], unsigned Left, unsigned Right) { int Center, i; long Max

Similar documents
Let G = (V, E) be a connected, undirected graph with a real-valued weight function w defined on E. Let A be a set of E, possibly empty, that is includ

untitled

int main(void) int a; int b; a=3; b=a+5; printf("a : %d \n", a); printf("b : %d \n", b); a b 3 a a+5 b &a(12ff60) &b(12ff54) 3 a 8 b printf(" a : %x \

K&R2 Reference Manual 번역본

C++-¿Ïº®Çؼ³10Àå

chap8.PDF

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

03장.스택.key

untitled


프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

ePapyrus PDF Document

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

untitled

중간고사


untitled

13주-14주proc.PDF

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

본 강의에 들어가기 전

11장 포인터


歯7장.PDF

chap7.key

chap7.PDF

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

11강-힙정렬.ppt

Chapter_06

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

untitled

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

슬라이드 1

6장정렬알고리즘.key

chap 5: Trees

untitled

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

Chapter 4. LISTS

Chapter 4. LISTS

PowerPoint 프레젠테이션

5.스택(강의자료).key

시작하기 시작할 준비가 되었으면 다음 설명에 따라 설문조사를 실시한다. 1단계: 허락받기 클럽을 떠나는 회원에게 에 응해 줄 것인지 물어본다. 이 설문 조사는 클럽의 문제점을 보완해 향후 같은 이유로 이탈하는 회원들이 없도록 하기 위한 것이며, 응답 내용은 대외비로 처

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

Microsoft PowerPoint - chap11-포인터의활용.pptx

2002년 2학기 자료구조

Microsoft PowerPoint - chap10-함수의활용.pptx

10주차.key

chap01_time_complexity.key

서강대학교공과대학컴퓨터공학과 (1/5) CSE3081 (2 반 ): 알고리즘설계와분석 < 프로그래밍숙제 2> (v_1.0) 담당교수 : 임인성 2015 년 10 월 13 일 마감 : 10 월 31 일토요일오후 8 시정각 제출물, 제출방법, LATE 처리방법등 : 조교가

Microsoft PowerPoint - chap12-고급기능.pptx

chap10.PDF

Microsoft PowerPoint - ch06 - 배열, 동적배열, 정렬 pm0200

슬라이드 1

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Infinity(∞) Strategy

문서의 제목 나눔명조R, 40pt

서강대학교공과대학컴퓨터공학과 CSE3081 알고리즘설계와분석 (2 반 ) 기말고사 (2015 년 12 월 17 일 ) 알고리즘설계와분석 (CSE3081(2 반 )) 기말고사 (2015년 12월17일 ( 목 ) 오전 9시 30분 ) 담당교수 : 서강대학교컴퓨터공학과임인성

Microsoft PowerPoint - chap03-변수와데이터형.pptx

OCW_C언어 기초

Microsoft PowerPoint - ch07 - 포인터 pm0415

PowerPoint 프레젠테이션

商用

C 프로그래밊 개요

歯9장.PDF

Microsoft PowerPoint - 27.pptx

Microsoft PowerPoint - lab14.pptx

, ( ),, ( ), 3, int kor[5]; int eng[5]; int Microsoft Windows 4 (ANSI C2 ) int kor[5] 20 # define #define SIZE 20 int a[10]; char c[10]; float

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

Lab 3. 실습문제 (Single linked list)_해답.hwp

1장. 유닉스 시스템 프로그래밍 개요

C 언어 프로그래밊 과제 풀이

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

2015 개정교육과정에따른정보과평가기준개발연구 연구책임자 공동연구자 연구협력관

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

Microsoft PowerPoint - ch07 - 포인터 pm0415

The C++ Programming Language 4 장타입과선언 4.11 연습문제 Hello,world! 프로그램을실행시킨다. 프로그램이컴파일되지않으면 B3.1 을참고하자. #include<iostream> //#include 문, 헤더파일, 전처리지시

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

PowerPoint 프레젠테이션

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

ch15

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

OCW_C언어 기초

슬라이드 1

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

C 프로그래밊 개요

Microsoft PowerPoint - ch 전처리기, 다중 소스파일 pm1015

PowerSHAPE 따라하기 Calculate 버튼을 클릭한다. Close 버튼을 눌러 미러 릴리프 페이지를 닫는다. D 화면을 보기 위하여 F 키를 누른다. - 모델이 다음과 같이 보이게 될 것이다. 열매 만들기 Shape Editor를 이용하여 열매를 만들어 보도록

Microsoft PowerPoint - Chapter_09.pptx

Index

컴파일러

MPLAB C18 C


chap x: G입력

Lab 5. 실습문제 (Double linked list)-1_해답.hwp

문제는다양한방법으로풀수있으며, 다음의풀이는여러해법중하나이다. [ 문제 1] 밀도구하기 질량밀도 이다. 물체의질량 M과부피 V가주어지면밀도는 M/V로구할수있다. 부피 여기서질량 M 과부피 V 는정수이지만 M/V 은실수가될수있기때문에 M 과 V 를받 을때실수로입력받는다.

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft PowerPoint - Chapter_05.pptx

Transcription:

알고리즘설계와분석 (CSE3081-2반 ) 중간고사 (2013년 10월24일 ( 목 ) 오전 10시30분 ) 담당교수 : 서강대학교컴퓨터공학과임인성수강학년 : 2학년문제 : 총 8쪽 12문제 ========================================= < 주의 > 답안지에답을쓴후제출할것. 만약공간이부족하면답안지의뒷면을이용하고반드시답을쓰는칸에답안지의어느쪽의뒷면에답을기술하였는지명시할것. 연습지의내용은채점하지않음. ========================================= a log int i; void select(int a[], int le, int ri, int k) { // Input: a[le] to a[ri] inclusive if (ri <= le) { i = le; return; // Line (A) i = partition(a, le, ri); // takes O(ri-le+1) time if (i > k) select(a, le, i-1, k); if (i < k) select(a, i+1, ri, k); select(a, 0, n-1, k-1) n k 1

Line (A) å j a k= i k #define max(a, b) (((a) >= (b))? (a) : (b)) long MaxSubseqSum0(int A[], unsigned Left, unsigned Right) { int Center, i; long MaxSum, MaxLeft, MaxRight, MaxCenter; long MaxCenterL, MaxCenterR, ThisSum; if (Left == Right) { if (A[Left] > 0) return A[Left]; else return 0; Center = (Left + Right) / 2; MaxLeft = MaxSubseqSum(A, Left, Center); MaxRight = MaxSubseqSum(A, Center+1, Right); MaxCenter = (B) ; MaxSum = max(max(maxleft, MaxRight), MaxCenter); return MaxSum; long MaxSubseqSum1(int A[], unsigned n) { long MaxSum, ThisSum; unsigned k; MaxSum = ThisSum = 0; for (k = 0; k < n; k++) { if (ThisSum + A[k] > 0) ThisSum = (C) ; else ThisSum = 0; if (MaxSum < ThisSum) MaxSum = ThisSum; return MaxSum; (A) (B) (C) printf("the right index is %d.\n", right); MaxCenterL = 0; ThisSum = 0; for (i = Center; i >= Left; i--) { ThisSum = (A) ; MaxCenterL = max(maxcenterl, ThisSum); MaxCenterR = 0; ThisSum = 0; for (i = Center+1; i <= Right; i++) { ThisSum = (A) ; MaxCenterR = max(maxcenterr, ThisSum); S // Find the k-th smallest elements of S. procedure SELECT(k, S) { if S < 50 { sort S; return k-th smallest element in S; else { divide S into sequences of 5 elements each with up to four leftover elements; sort each 5-element sequence; 2

let M be the sequence of medians of the 5-element sets; m = SELECT(ceil( M /2), M); let S1, S2, and S3 be the sequences of elements in S less than, equal to, and greater than m, respectively; if S1 >= k { return SELECT(k, S1); else if ( S1 + S2 >= k) { return m; else { return SELECT( (A) ); (A) (B) (B) m m = median of three randomly selected elements of S; max 3

if (X[i]!= X[j]) { L[i][j] = max( (A), (B) ); else { // X[i] == X[j] if (j == i+1) L[i][j] = (C) ; else L[i][j] = (D) + 2; void sort(int data[], int n) { // Sort the n elements in the array data[]. my_sort(data, 0, n-1); // Line (A) void my_sort(int array[], int left, int right) { int what, l_hold, r_hold; // Line (B) l_hold = left; r_hold = right; what = array[left]; // Line (C) while (left < right) { while ((array[right] >= what) && (left < right)) right--; if (left!= right) { array[left] = array[right]; left++; while ((array[left] <= what) && (left < right)) left++; if (left!= right) { array[right] = array[left]; right--; array[left] = what; what = left; left = l_hold; right = r_hold; // Line (D) if (left < what) my_sort(array, left, what-1); if (right > what) my_sort(array, (E) ); Line (C) Line (D) (E) sort() sort() Line (B) if (right-left <= 5) return; Line (A) your_sort() your_sort(data, 0, n-1); 4

#define less(a, B) ((A) < (B)) #define exch(a, B) { int t = A; A = B; B = t; #define compexch(a, B) if (less(b, A)) exch(a, B) void your_sort(int a[], int l, int r) { int i; for (i = l+1; i <= r; i++) compexch(a[l], a[i]); for (i = l+2; i <= r; i++) { int j = i; int v = a[i]; while (less(v, a[j-1])) { a[j] = a[j-1]; (F) ; a[j] = v; your_sort() (F) (A) (B) (C) #include <stdio.h> #define N 5 #define INFTY 100000 int c[n+1][n+2] = { -1, -1, -1, -1, -1, -1, -1, -1, 7, 3, 5, 6, 1, -1, -1, 2, 6, 7, 0, 2, -1, -1, 3, 5, 7, 8, 2, -1, -1, 7, 6, 1, 1, 4, -1, -1, 6, 7, 4, 7, 8, -1 ; int p[n+1][n+2], q[n+1][n+2]; int min3(int a, int b, int c) { // Return the minimum of a, b and c. void ComputeCBCosts(int n) { int i, j, min; for (i = 1; i <= n; i++) q[1][i] = c[1][i]; for (i = 1; i <= n; i++) { q[i][0] = INFTY; q[i][n+1] = INFTY; for (i = 2; i <= n; i++) { for (j = 1; j <= n; j++) { min = min3(q[i-1][j-1], (B) ); q[i][j] = min + (C) ; if (min == q[i-1][j-1]) p[i][j] = -1; else if (min == q[i-1][j]) p[i][j] = 0; else p[i][j] = 1; void PrintShortestPath(int n, int imin) { printf(" (%d, %d) <-", n, imin); if (n == 2) printf(" (%d, %d) \n", 1, imin + (D) ); else PrintShortestPath(n-1, imin + (D) ); void ComputeCBShortestPath(int n) { int i, imin, min; ComputeCBCosts(n); imin = 1; min = q[n][1]; for (i = 2; i <= n; i++) { if (q[n][i] < min) { imin = i; min = q[n][i]; 5

printf("*** The cost of the shortest path is %d. \n", q[n][imin]); PrintShortestPath(n, imin); void main(void) { ComputeCBShortestPath(N); (D) PrintShortestPath(n, imin) ( 문제끝 ) 6

1 // Starting from the code in http://www.geeksforgeeks.org/dynamic-programming-set-21-box-stacking-problem/ 2 // Modified for Sogang CSE3081-2 3 4 5 /* Solving the Box Stacking problem using Dynamic Programming */ 6 #include<stdio.h> 7 #include<stdlib.h> 8 9 #define min(x,y) ((x) < (y))? (x) : (y) 10 #define max(x,y) ((x) > (y))? (x) : (y) 11 12 typedef struct _Box { 13 int h, w, d; // d >= w 14 Box; 15 16 int compare_area (const void *a, const void * b) { 17 return ( (*(Box *)b).d * (*(Box *)b).w ) - 18 ( (*(Box *)a).d * (*(Box *)a).w ); 19 20 21 void BoxStacking( Box boxes[], int n ) { 22 Box *allboxes; 23 int *H, *below, tmax, tmaxi, cur, next; 24 25 allboxes = (Box *) malloc(sizeof(box)*3*n); 26 H = (int *) malloc(sizeof(int)*3*n); 27 below = (int *) malloc(sizeof(int)*3*n); 28 29 printf("the input boxes are\n"); 30 for (int i = 0; i < n; i++ ) 31 printf("%d x %d x %d\n", boxes[i].h, boxes[i].w, boxes[i].d); 32 33 34 next = 0; 35 for (int i = 0; i < n; i++) { 36 allboxes[next++] = boxes[i]; 37 38 allboxes[next].h = boxes[i].w; 39 allboxes[next].d = max(boxes[i].h, boxes[i].d); 40 allboxes[next++].w = min(boxes[i].h, boxes[i].d); 41 42 allboxes[next].h = boxes[i].d; 43 allboxes[next].d = max(boxes[i].h, boxes[i].w); 44 allboxes[next++].w = min(boxes[i].h, boxes[i].w); 45 46 47 qsort(allboxes, 3*n, sizeof(allboxes[0]), compare_area); 48 49 printf("\nthe all sorted rotations of the input boxes are\n"); 50 for (int i = 0; i < 3*n; i++ ) 51 printf("%d x %d x %d\n", allboxes[i].h, allboxes[i].w, allboxes[i].d); 52 printf("\n"); 53 54 55 for (int i = 0; i < 3*n; i++) { 56 H[i] = allboxes[i].h; below[i] = i; 57 58 59 for (int i = 1; i < 3*n; i++ ) 60 for (int j = 0; j < i; j++ ) 61 if ( allboxes[i].w < allboxes[j].w && allboxes[i].d < allboxes[j].d 62 && H[i] < H[j] + allboxes[i].h ) { 63 H[i] = H[j] + allboxes[i].h; 64 below[i] = j; 65 66 67 tmax = tmaxi = -1; 68 for ( int i = 0; i < 3*n; i++ ) 69 if ( tmax < H[i] ) { 70 tmax = H[i]; tmaxi = i; 71

72 73 printf("the maximum possible height is %d.\n\n", tmax); 74 printf("the stacking order from top to bottom is \n"); 75 76 next = tmaxi; 77 do { 78 cur = next; 79 printf("** %d x %d x %d\n", allboxes[cur].h, allboxes[cur].d, allboxes[cur].w); 80 while ((next = below[cur])!= cur); 81 printf("\n"); 82 83 84 85 void main(void) { 86 int n; 87 Box boxes[] = { {4, 6, 7, {1, 2, 3, {4, 5, 6, {10, 12, 32, {3, 4, 5 ; 88 89 n = sizeof(boxes)/sizeof(boxes[0]); 90 BoxStacking(boxes, n); 91 92 93