Here's a python program. Please rewrite it in c with the type signature float solve_dp(float* arr, int size, int lines_left) def solve_dp(graph, lines_left): n = len(graph) dp = [[[1e9 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] # Initialize how as -1 indicating no decision made how = [[[-1 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] for i in range(n, -1, -1): for j in range(lines_left + 1): for k in range(10): if i == n and j == 0: dp[i][j][k] = 0 else: # Option 1: don't take the line if i < n and k < 9: if dp[i + 1][j][k + 1] < dp[i][j][k]: dp[i][j][k] = dp[i + 1][j][k + 1] how[i][j][k] = k + 1 # Representing choosing not to take the line # Option 2: take the line if i < n and j > 0: cost = graph[i] + (k - 8)**2 if cost + dp[i + 1][j - 1][0] < dp[i][j][k]: dp[i][j][k] = cost + dp[i + 1][j - 1][0] how[i][j][k] = 0 # Representing choosing to take the line # Reconstruct the solution i, j, k = 0, lines_left, 6 taken_lines = [] while i < n: if how[i][j][k] == 0: # Chose to take the line taken_lines.append(n - i) i += 1 j -= 1 k = 0 else: # Chose not to take the line i += 1 k += 1 return dp[0][lines_left][6]
Here's a python program. Please rewrite it in c with the type signature float solve_dp(float* arr, int size, int lines_left) def solve_dp(graph, lines_left): n = len(graph) dp = [[[1e9 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] # Initialize how as -1 indicating no decision made how = [[[-1 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] for i in range(n, -1, -1): for j in range(lines_left + 1): for k in range(10): if i == n and j == 0: dp[i][j][k] = 0 else: # Option 1: don't take the line if i < n and k < 9: if dp[i + 1][j][k + 1] < dp[i][j][k]: dp[i][j][k] = dp[i + 1][j][k + 1] how[i][j][k] = k + 1 # Representing choosing not to take the line # Option 2: take the line if i < n and j > 0: cost = graph[i] + (k - 8)**2 if cost + dp[i + 1][j - 1][0] < dp[i][j][k]: dp[i][j][k] = cost + dp[i + 1][j - 1][0] how[i][j][k] = 0 # Representing choosing to take the line # Reconstruct the solution i, j, k = 0, lines_left, 6 taken_lines = [] while i < n: if how[i][j][k] == 0: # Chose to take the line taken_lines.append(n - i) i += 1 j -= 1 k = 0 else: # Chose not to take the line i += 1 k += 1 return dp[0][lines_left][6]
Here's the equivalent C implementation of the Python program, following the type signature `float solve_dp(float* arr, int size, int lines_left)`:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include <float.h> #include <stdlib.h> float solve_dp(float* graph, int size, int lines_left) { // 3D dynamic programming arrays float*** dp = malloc((size + 1) * sizeof(float**)); int*** how = malloc((size + 1) * sizeof(int**)); for (int i = 0; i <= size; i++) { dp[i] = malloc((lines_left + 1) * sizeof(float*)); how[i] = malloc((lines_left + 1) * sizeof(int*)); for (int j = 0; j <= lines_left; j++) { dp[i][j] = malloc(10 * sizeof(float)); how[i][j] = malloc(10 * sizeof(int)); for (int k = 0; k < 10; k++) { dp[i][j][k] = 1e9; how[i][j][k] = -1; } } } // Base case initialization for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { if (j == 0) { dp[size][j][k] = 0; } } } // Dynamic programming computation for (int i = size - 1; i >= 0; i--) { for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { // Option 1: don't take the line if (k < 9) { if (dp[i + 1][j][k + 1] < dp[i][j][k]) { dp[i][j][k] = dp[i + 1][j][k + 1]; how[i][j][k] = k + 1; // Representing choosing not to take the line } } // Option 2: take the line if (j > 0) { float cost = graph[i] + (k - 8) * (k - 8); if (cost + dp[i + 1][j - 1][0] < dp[i][j][k]) { dp[i][j][k] = cost + dp[i + 1][j - 1][0]; how[i][j][k] = 0; // Representing choosing to take the line } } } } } float result = dp[0][lines_left][6]; // Free allocated memory for (int i = 0; i <= size; i++) { for (int j = 0; j <= lines_left; j++) { free(dp[i][j]); free(how[i][j]); } free(dp[i]); free(how[i]); } free(dp); free(how); return result; } |
1 2 3 4 5 6 7 8 9 10 | int main() { float graph[] = {1.5, 2.3, 3.7, 4.2}; int size = sizeof(graph) / sizeof(graph[0]); int lines_left = 2; float result = solve_dp(graph, size, lines_left); printf("Minimum cost: %f\n", result); return 0; } |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include <float.h> #include <stdlib.h> float solve_dp(float* graph, int size, int lines_left) { // 3D dynamic programming arrays float*** dp = malloc((size + 1) * sizeof(float**)); int*** how = malloc((size + 1) * sizeof(int**)); for (int i = 0; i <= size; i++) { dp[i] = malloc((lines_left + 1) * sizeof(float*)); how[i] = malloc((lines_left + 1) * sizeof(int*)); for (int j = 0; j <= lines_left; j++) { dp[i][j] = malloc(10 * sizeof(float)); how[i][j] = malloc(10 * sizeof(int)); for (int k = 0; k < 10; k++) { dp[i][j][k] = 1e9; how[i][j][k] = -1; } } } // Base case initialization for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { if (j == 0) { dp[size][j][k] = 0; } } } // Dynamic programming computation for (int i = size - 1; i >= 0; i--) { for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { // Option 1: don't take the line if (k < 9) { if (dp[i + 1][j][k + 1] < dp[i][j][k]) { dp[i][j][k] = dp[i + 1][j][k + 1]; how[i][j][k] = k + 1; // Representing choosing not to take the line } } // Option 2: take the line if (j > 0) { float cost = graph[i] + (k - 8) * (k - 8); if (cost + dp[i + 1][j - 1][0] < dp[i][j][k]) { dp[i][j][k] = cost + dp[i + 1][j - 1][0]; how[i][j][k] = 0; // Representing choosing to take the line } } } } } float result = dp[0][lines_left][6]; // Free allocated memory for (int i = 0; i <= size; i++) { for (int j = 0; j <= lines_left; j++) { free(dp[i][j]); free(how[i][j]); } free(dp[i]); free(how[i]); } free(dp); free(how); return result; } |
Running the following program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #include <float.h> #include <stdlib.h> float solve_dp(float* graph, int size, int lines_left) { // 3D dynamic programming arrays float*** dp = malloc((size + 1) * sizeof(float**)); int*** how = malloc((size + 1) * sizeof(int**)); for (int i = 0; i <= size; i++) { dp[i] = malloc((lines_left + 1) * sizeof(float*)); how[i] = malloc((lines_left + 1) * sizeof(int*)); for (int j = 0; j <= lines_left; j++) { dp[i][j] = malloc(10 * sizeof(float)); how[i][j] = malloc(10 * sizeof(int)); for (int k = 0; k < 10; k++) { dp[i][j][k] = 1e9; how[i][j][k] = -1; } } } // Base case initialization for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { if (j == 0) { dp[size][j][k] = 0; } } } // Dynamic programming computation for (int i = size - 1; i >= 0; i--) { for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { // Option 1: don't take the line if (k < 9) { if (dp[i + 1][j][k + 1] < dp[i][j][k]) { dp[i][j][k] = dp[i + 1][j][k + 1]; how[i][j][k] = k + 1; // Representing choosing not to take the line } } // Option 2: take the line if (j > 0) { float cost = graph[i] + (k - 8) * (k - 8); if (cost + dp[i + 1][j - 1][0] < dp[i][j][k]) { dp[i][j][k] = cost + dp[i + 1][j - 1][0]; how[i][j][k] = 0; // Representing choosing to take the line } } } } } float result = dp[0][lines_left][6]; // Free allocated memory for (int i = 0; i <= size; i++) { for (int j = 0; j <= lines_left; j++) { free(dp[i][j]); free(how[i][j]); } free(dp[i]); free(how[i]); } free(dp); free(how); return result; } #include<stdio.h> #include<stdlib.h> int main() { float arr[] = {71, 89, 34, 63, 19, 94, 54, 61, 88, 20, 66, 46, 26, 87, 55, 81, 6, 2, 72, 75, 98, 78, 24, 95, 73, 7, 56, 48, 14, 99, 64, 51, 69, 77, 28, 47, 8, 22, 49, 3, 62, 32, 10, 82, 35, 18, 85, 60, 83, 23, 5, 40, 41, 68, 53, 52, 44, 45, 65, 84, 93, 25, 13, 1, 31, 11, 12, 97, 38, 0, 43, 90, 36, 70, 33, 17, 21, 30, 16, 15, 74, 67, 58, 37, 39, 96, 79, 29, 27, 92, 86, 9, 80, 42, 57, 91, 59, 4, 76, 50}; int answer = solve_dp(arr, 100, 100); int expected = 11290; if (answer != expected) { printf("Wrong answer; got %d instead of %d.\n", answer, expected); exit(1); } printf("All tests passed\n"); } |
All tests passed
Testing if the previous output contains the string All tests passed
: True
Here's a python program. Please rewrite it in c with the type signature float solve_dp(float* arr, int size, int lines_left) def solve_dp(graph, lines_left): n = len(graph) dp = [[[1e9 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] # Initialize how as -1 indicating no decision made how = [[[-1 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] for i in range(n, -1, -1): for j in range(lines_left + 1): for k in range(10): if i == n and j == 0: dp[i][j][k] = 0 else: # Option 1: don't take the line if i < n and k < 9: if dp[i + 1][j][k + 1] < dp[i][j][k]: dp[i][j][k] = dp[i + 1][j][k + 1] how[i][j][k] = k + 1 # Representing choosing not to take the line # Option 2: take the line if i < n and j > 0: cost = graph[i] + (k - 8)**2 if cost + dp[i + 1][j - 1][0] < dp[i][j][k]: dp[i][j][k] = cost + dp[i + 1][j - 1][0] how[i][j][k] = 0 # Representing choosing to take the line # Reconstruct the solution i, j, k = 0, lines_left, 6 taken_lines = [] while i < n: if how[i][j][k] == 0: # Chose to take the line taken_lines.append(n - i) i += 1 j -= 1 k = 0 else: # Chose not to take the line i += 1 k += 1 return dp[0][lines_left][6]
Here's a python program. Please rewrite it in c with the type signature float solve_dp(float* arr, int size, int lines_left) def solve_dp(graph, lines_left): n = len(graph) dp = [[[1e9 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] # Initialize how as -1 indicating no decision made how = [[[-1 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] for i in range(n, -1, -1): for j in range(lines_left + 1): for k in range(10): if i == n and j == 0: dp[i][j][k] = 0 else: # Option 1: don't take the line if i < n and k < 9: if dp[i + 1][j][k + 1] < dp[i][j][k]: dp[i][j][k] = dp[i + 1][j][k + 1] how[i][j][k] = k + 1 # Representing choosing not to take the line # Option 2: take the line if i < n and j > 0: cost = graph[i] + (k - 8)**2 if cost + dp[i + 1][j - 1][0] < dp[i][j][k]: dp[i][j][k] = cost + dp[i + 1][j - 1][0] how[i][j][k] = 0 # Representing choosing to take the line # Reconstruct the solution i, j, k = 0, lines_left, 6 taken_lines = [] while i < n: if how[i][j][k] == 0: # Chose to take the line taken_lines.append(n - i) i += 1 j -= 1 k = 0 else: # Chose not to take the line i += 1 k += 1 return dp[0][lines_left][6]
Here's the equivalent C implementation with the specified type signature:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include <float.h> #include <stdlib.h> float solve_dp(float* graph, int size, int lines_left) { // Allocate 3D DP array float*** dp = malloc((size + 1) * sizeof(float**)); int*** how = malloc((size + 1) * sizeof(int**)); for (int i = 0; i <= size; i++) { dp[i] = malloc((lines_left + 1) * sizeof(float*)); how[i] = malloc((lines_left + 1) * sizeof(int*)); for (int j = 0; j <= lines_left; j++) { dp[i][j] = malloc(10 * sizeof(float)); how[i][j] = malloc(10 * sizeof(int)); for (int k = 0; k < 10; k++) { dp[i][j][k] = 1e9; how[i][j][k] = -1; } } } // Initialize base case for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { if (j == 0 && k == 0) { dp[size][j][k] = 0; } } } // Dynamic Programming for (int i = size - 1; i >= 0; i--) { for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { // Option 1: don't take the line if (k < 9) { if (dp[i + 1][j][k + 1] < dp[i][j][k]) { dp[i][j][k] = dp[i + 1][j][k + 1]; how[i][j][k] = k + 1; } } // Option 2: take the line if (j > 0) { float cost = graph[i] + (k - 8) * (k - 8); if (cost + dp[i + 1][j - 1][0] < dp[i][j][k]) { dp[i][j][k] = cost + dp[i + 1][j - 1][0]; how[i][j][k] = 0; } } } } } float result = dp[0][lines_left][6]; // Free memory for (int i = 0; i <= size; i++) { for (int j = 0; j <= lines_left; j++) { free(dp[i][j]); free(how[i][j]); } free(dp[i]); free(how[i]); } free(dp); free(how); return result; } |
1 2 3 4 5 6 | float graph[] = {1.0, 2.0, 3.0, 4.0, 5.0}; int size = 5; int lines_left = 3; float result = solve_dp(graph, size, lines_left); printf("Minimal cost: %f\n", result); |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include <float.h> #include <stdlib.h> float solve_dp(float* graph, int size, int lines_left) { // Allocate 3D DP array float*** dp = malloc((size + 1) * sizeof(float**)); int*** how = malloc((size + 1) * sizeof(int**)); for (int i = 0; i <= size; i++) { dp[i] = malloc((lines_left + 1) * sizeof(float*)); how[i] = malloc((lines_left + 1) * sizeof(int*)); for (int j = 0; j <= lines_left; j++) { dp[i][j] = malloc(10 * sizeof(float)); how[i][j] = malloc(10 * sizeof(int)); for (int k = 0; k < 10; k++) { dp[i][j][k] = 1e9; how[i][j][k] = -1; } } } // Initialize base case for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { if (j == 0 && k == 0) { dp[size][j][k] = 0; } } } // Dynamic Programming for (int i = size - 1; i >= 0; i--) { for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { // Option 1: don't take the line if (k < 9) { if (dp[i + 1][j][k + 1] < dp[i][j][k]) { dp[i][j][k] = dp[i + 1][j][k + 1]; how[i][j][k] = k + 1; } } // Option 2: take the line if (j > 0) { float cost = graph[i] + (k - 8) * (k - 8); if (cost + dp[i + 1][j - 1][0] < dp[i][j][k]) { dp[i][j][k] = cost + dp[i + 1][j - 1][0]; how[i][j][k] = 0; } } } } } float result = dp[0][lines_left][6]; // Free memory for (int i = 0; i <= size; i++) { for (int j = 0; j <= lines_left; j++) { free(dp[i][j]); free(how[i][j]); } free(dp[i]); free(how[i]); } free(dp); free(how); return result; } |
Running the following program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #include <float.h> #include <stdlib.h> float solve_dp(float* graph, int size, int lines_left) { // Allocate 3D DP array float*** dp = malloc((size + 1) * sizeof(float**)); int*** how = malloc((size + 1) * sizeof(int**)); for (int i = 0; i <= size; i++) { dp[i] = malloc((lines_left + 1) * sizeof(float*)); how[i] = malloc((lines_left + 1) * sizeof(int*)); for (int j = 0; j <= lines_left; j++) { dp[i][j] = malloc(10 * sizeof(float)); how[i][j] = malloc(10 * sizeof(int)); for (int k = 0; k < 10; k++) { dp[i][j][k] = 1e9; how[i][j][k] = -1; } } } // Initialize base case for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { if (j == 0 && k == 0) { dp[size][j][k] = 0; } } } // Dynamic Programming for (int i = size - 1; i >= 0; i--) { for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { // Option 1: don't take the line if (k < 9) { if (dp[i + 1][j][k + 1] < dp[i][j][k]) { dp[i][j][k] = dp[i + 1][j][k + 1]; how[i][j][k] = k + 1; } } // Option 2: take the line if (j > 0) { float cost = graph[i] + (k - 8) * (k - 8); if (cost + dp[i + 1][j - 1][0] < dp[i][j][k]) { dp[i][j][k] = cost + dp[i + 1][j - 1][0]; how[i][j][k] = 0; } } } } } float result = dp[0][lines_left][6]; // Free memory for (int i = 0; i <= size; i++) { for (int j = 0; j <= lines_left; j++) { free(dp[i][j]); free(how[i][j]); } free(dp[i]); free(how[i]); } free(dp); free(how); return result; } #include<stdio.h> #include<stdlib.h> int main() { float arr[] = {71, 89, 34, 63, 19, 94, 54, 61, 88, 20, 66, 46, 26, 87, 55, 81, 6, 2, 72, 75, 98, 78, 24, 95, 73, 7, 56, 48, 14, 99, 64, 51, 69, 77, 28, 47, 8, 22, 49, 3, 62, 32, 10, 82, 35, 18, 85, 60, 83, 23, 5, 40, 41, 68, 53, 52, 44, 45, 65, 84, 93, 25, 13, 1, 31, 11, 12, 97, 38, 0, 43, 90, 36, 70, 33, 17, 21, 30, 16, 15, 74, 67, 58, 37, 39, 96, 79, 29, 27, 92, 86, 9, 80, 42, 57, 91, 59, 4, 76, 50}; int answer = solve_dp(arr, 100, 100); int expected = 11290; if (answer != expected) { printf("Wrong answer; got %d instead of %d.\n", answer, expected); exit(1); } printf("All tests passed\n"); } |
All tests passed
Testing if the previous output contains the string All tests passed
: True
Here's a python program. Please rewrite it in c with the type signature float solve_dp(float* arr, int size, int lines_left) def solve_dp(graph, lines_left): n = len(graph) dp = [[[1e9 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] # Initialize how as -1 indicating no decision made how = [[[-1 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] for i in range(n, -1, -1): for j in range(lines_left + 1): for k in range(10): if i == n and j == 0: dp[i][j][k] = 0 else: # Option 1: don't take the line if i < n and k < 9: if dp[i + 1][j][k + 1] < dp[i][j][k]: dp[i][j][k] = dp[i + 1][j][k + 1] how[i][j][k] = k + 1 # Representing choosing not to take the line # Option 2: take the line if i < n and j > 0: cost = graph[i] + (k - 8)**2 if cost + dp[i + 1][j - 1][0] < dp[i][j][k]: dp[i][j][k] = cost + dp[i + 1][j - 1][0] how[i][j][k] = 0 # Representing choosing to take the line # Reconstruct the solution i, j, k = 0, lines_left, 6 taken_lines = [] while i < n: if how[i][j][k] == 0: # Chose to take the line taken_lines.append(n - i) i += 1 j -= 1 k = 0 else: # Chose not to take the line i += 1 k += 1 return dp[0][lines_left][6]
Here's a python program. Please rewrite it in c with the type signature float solve_dp(float* arr, int size, int lines_left) def solve_dp(graph, lines_left): n = len(graph) dp = [[[1e9 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] # Initialize how as -1 indicating no decision made how = [[[-1 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] for i in range(n, -1, -1): for j in range(lines_left + 1): for k in range(10): if i == n and j == 0: dp[i][j][k] = 0 else: # Option 1: don't take the line if i < n and k < 9: if dp[i + 1][j][k + 1] < dp[i][j][k]: dp[i][j][k] = dp[i + 1][j][k + 1] how[i][j][k] = k + 1 # Representing choosing not to take the line # Option 2: take the line if i < n and j > 0: cost = graph[i] + (k - 8)**2 if cost + dp[i + 1][j - 1][0] < dp[i][j][k]: dp[i][j][k] = cost + dp[i + 1][j - 1][0] how[i][j][k] = 0 # Representing choosing to take the line # Reconstruct the solution i, j, k = 0, lines_left, 6 taken_lines = [] while i < n: if how[i][j][k] == 0: # Chose to take the line taken_lines.append(n - i) i += 1 j -= 1 k = 0 else: # Chose not to take the line i += 1 k += 1 return dp[0][lines_left][6]
Here's the equivalent C implementation of the Python program with the specified type signature:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <float.h> #include <stdlib.h> float solve_dp(float* graph, int size, int lines_left) { // Allocate 3D DP array and how array float*** dp = malloc((size + 1) * sizeof(float**)); int*** how = malloc((size + 1) * sizeof(int**)); for (int i = 0; i <= size; i++) { dp[i] = malloc((lines_left + 1) * sizeof(float*)); how[i] = malloc((lines_left + 1) * sizeof(int*)); for (int j = 0; j <= lines_left; j++) { dp[i][j] = malloc(10 * sizeof(float)); how[i][j] = malloc(10 * sizeof(int)); for (int k = 0; k < 10; k++) { dp[i][j][k] = 1e9; how[i][j][k] = -1; } } } // Initialize base case dp[size][0][0] = 0; // Dynamic Programming for (int i = size - 1; i >= 0; i--) { for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { // Option 1: Don't take the line if (k < 9) { if (dp[i + 1][j][k + 1] < dp[i][j][k]) { dp[i][j][k] = dp[i + 1][j][k + 1]; how[i][j][k] = k + 1; } } // Option 2: Take the line if (j > 0) { float cost = graph[i] + (k - 8) * (k - 8); if (cost + dp[i + 1][j - 1][0] < dp[i][j][k]) { dp[i][j][k] = cost + dp[i + 1][j - 1][0]; how[i][j][k] = 0; } } } } } // Store result before freeing memory float result = dp[0][lines_left][6]; // Free memory for (int i = 0; i <= size; i++) { for (int j = 0; j <= lines_left; j++) { free(dp[i][j]); free(how[i][j]); } free(dp[i]); free(how[i]); } free(dp); free(how); return result; } |
1 2 3 4 5 6 7 8 | int main() { float graph[] = {1.5, 2.3, 3.7, 4.2}; int size = sizeof(graph) / sizeof(graph[0]); int lines_left = 2; float result = solve_dp(graph, size, lines_left); // Use result return 0; } |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <float.h> #include <stdlib.h> float solve_dp(float* graph, int size, int lines_left) { // Allocate 3D DP array and how array float*** dp = malloc((size + 1) * sizeof(float**)); int*** how = malloc((size + 1) * sizeof(int**)); for (int i = 0; i <= size; i++) { dp[i] = malloc((lines_left + 1) * sizeof(float*)); how[i] = malloc((lines_left + 1) * sizeof(int*)); for (int j = 0; j <= lines_left; j++) { dp[i][j] = malloc(10 * sizeof(float)); how[i][j] = malloc(10 * sizeof(int)); for (int k = 0; k < 10; k++) { dp[i][j][k] = 1e9; how[i][j][k] = -1; } } } // Initialize base case dp[size][0][0] = 0; // Dynamic Programming for (int i = size - 1; i >= 0; i--) { for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { // Option 1: Don't take the line if (k < 9) { if (dp[i + 1][j][k + 1] < dp[i][j][k]) { dp[i][j][k] = dp[i + 1][j][k + 1]; how[i][j][k] = k + 1; } } // Option 2: Take the line if (j > 0) { float cost = graph[i] + (k - 8) * (k - 8); if (cost + dp[i + 1][j - 1][0] < dp[i][j][k]) { dp[i][j][k] = cost + dp[i + 1][j - 1][0]; how[i][j][k] = 0; } } } } } // Store result before freeing memory float result = dp[0][lines_left][6]; // Free memory for (int i = 0; i <= size; i++) { for (int j = 0; j <= lines_left; j++) { free(dp[i][j]); free(how[i][j]); } free(dp[i]); free(how[i]); } free(dp); free(how); return result; } |
Running the following program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #include <float.h> #include <stdlib.h> float solve_dp(float* graph, int size, int lines_left) { // Allocate 3D DP array and how array float*** dp = malloc((size + 1) * sizeof(float**)); int*** how = malloc((size + 1) * sizeof(int**)); for (int i = 0; i <= size; i++) { dp[i] = malloc((lines_left + 1) * sizeof(float*)); how[i] = malloc((lines_left + 1) * sizeof(int*)); for (int j = 0; j <= lines_left; j++) { dp[i][j] = malloc(10 * sizeof(float)); how[i][j] = malloc(10 * sizeof(int)); for (int k = 0; k < 10; k++) { dp[i][j][k] = 1e9; how[i][j][k] = -1; } } } // Initialize base case dp[size][0][0] = 0; // Dynamic Programming for (int i = size - 1; i >= 0; i--) { for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { // Option 1: Don't take the line if (k < 9) { if (dp[i + 1][j][k + 1] < dp[i][j][k]) { dp[i][j][k] = dp[i + 1][j][k + 1]; how[i][j][k] = k + 1; } } // Option 2: Take the line if (j > 0) { float cost = graph[i] + (k - 8) * (k - 8); if (cost + dp[i + 1][j - 1][0] < dp[i][j][k]) { dp[i][j][k] = cost + dp[i + 1][j - 1][0]; how[i][j][k] = 0; } } } } } // Store result before freeing memory float result = dp[0][lines_left][6]; // Free memory for (int i = 0; i <= size; i++) { for (int j = 0; j <= lines_left; j++) { free(dp[i][j]); free(how[i][j]); } free(dp[i]); free(how[i]); } free(dp); free(how); return result; } #include<stdio.h> #include<stdlib.h> int main() { float arr[] = {71, 89, 34, 63, 19, 94, 54, 61, 88, 20, 66, 46, 26, 87, 55, 81, 6, 2, 72, 75, 98, 78, 24, 95, 73, 7, 56, 48, 14, 99, 64, 51, 69, 77, 28, 47, 8, 22, 49, 3, 62, 32, 10, 82, 35, 18, 85, 60, 83, 23, 5, 40, 41, 68, 53, 52, 44, 45, 65, 84, 93, 25, 13, 1, 31, 11, 12, 97, 38, 0, 43, 90, 36, 70, 33, 17, 21, 30, 16, 15, 74, 67, 58, 37, 39, 96, 79, 29, 27, 92, 86, 9, 80, 42, 57, 91, 59, 4, 76, 50}; int answer = solve_dp(arr, 100, 100); int expected = 11290; if (answer != expected) { printf("Wrong answer; got %d instead of %d.\n", answer, expected); exit(1); } printf("All tests passed\n"); } |
All tests passed
Testing if the previous output contains the string All tests passed
: True
Here's a python program. Please rewrite it in c with the type signature float solve_dp(float* arr, int size, int lines_left) def solve_dp(graph, lines_left): n = len(graph) dp = [[[1e9 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] # Initialize how as -1 indicating no decision made how = [[[-1 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] for i in range(n, -1, -1): for j in range(lines_left + 1): for k in range(10): if i == n and j == 0: dp[i][j][k] = 0 else: # Option 1: don't take the line if i < n and k < 9: if dp[i + 1][j][k + 1] < dp[i][j][k]: dp[i][j][k] = dp[i + 1][j][k + 1] how[i][j][k] = k + 1 # Representing choosing not to take the line # Option 2: take the line if i < n and j > 0: cost = graph[i] + (k - 8)**2 if cost + dp[i + 1][j - 1][0] < dp[i][j][k]: dp[i][j][k] = cost + dp[i + 1][j - 1][0] how[i][j][k] = 0 # Representing choosing to take the line # Reconstruct the solution i, j, k = 0, lines_left, 6 taken_lines = [] while i < n: if how[i][j][k] == 0: # Chose to take the line taken_lines.append(n - i) i += 1 j -= 1 k = 0 else: # Chose not to take the line i += 1 k += 1 return dp[0][lines_left][6]
Here's a python program. Please rewrite it in c with the type signature float solve_dp(float* arr, int size, int lines_left) def solve_dp(graph, lines_left): n = len(graph) dp = [[[1e9 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] # Initialize how as -1 indicating no decision made how = [[[-1 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] for i in range(n, -1, -1): for j in range(lines_left + 1): for k in range(10): if i == n and j == 0: dp[i][j][k] = 0 else: # Option 1: don't take the line if i < n and k < 9: if dp[i + 1][j][k + 1] < dp[i][j][k]: dp[i][j][k] = dp[i + 1][j][k + 1] how[i][j][k] = k + 1 # Representing choosing not to take the line # Option 2: take the line if i < n and j > 0: cost = graph[i] + (k - 8)**2 if cost + dp[i + 1][j - 1][0] < dp[i][j][k]: dp[i][j][k] = cost + dp[i + 1][j - 1][0] how[i][j][k] = 0 # Representing choosing to take the line # Reconstruct the solution i, j, k = 0, lines_left, 6 taken_lines = [] while i < n: if how[i][j][k] == 0: # Chose to take the line taken_lines.append(n - i) i += 1 j -= 1 k = 0 else: # Chose not to take the line i += 1 k += 1 return dp[0][lines_left][6]
Here's the equivalent C implementation with the specified type signature:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include <float.h> #include <stdlib.h> float solve_dp(float* graph, int size, int lines_left) { // 3D DP and how arrays, using dynamic allocation float*** dp = malloc((size + 1) * sizeof(float**)); int*** how = malloc((size + 1) * sizeof(int**)); for (int i = 0; i <= size; i++) { dp[i] = malloc((lines_left + 1) * sizeof(float*)); how[i] = malloc((lines_left + 1) * sizeof(int*)); for (int j = 0; j <= lines_left; j++) { dp[i][j] = malloc(10 * sizeof(float)); how[i][j] = malloc(10 * sizeof(int)); for (int k = 0; k < 10; k++) { dp[i][j][k] = 1e9; how[i][j][k] = -1; } } } // Base case for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { if (j == 0) { dp[size][j][k] = 0; } } } // DP traversal for (int i = size - 1; i >= 0; i--) { for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { // Option 1: don't take the line if (k < 9) { if (dp[i + 1][j][k + 1] < dp[i][j][k]) { dp[i][j][k] = dp[i + 1][j][k + 1]; how[i][j][k] = k + 1; } } // Option 2: take the line if (j > 0) { float cost = graph[i] + (k - 8) * (k - 8); if (cost + dp[i + 1][j - 1][0] < dp[i][j][k]) { dp[i][j][k] = cost + dp[i + 1][j - 1][0]; how[i][j][k] = 0; } } } } } float result = dp[0][lines_left][6]; // Free allocated memory for (int i = 0; i <= size; i++) { for (int j = 0; j <= lines_left; j++) { free(dp[i][j]); free(how[i][j]); } free(dp[i]); free(how[i]); } free(dp); free(how); return result; } |
1 2 3 | float graph[] = {1.0, 2.0, 3.0, ...}; int size = sizeof(graph) / sizeof(graph[0]); float result = solve_dp(graph, size, lines_left); |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include <float.h> #include <stdlib.h> float solve_dp(float* graph, int size, int lines_left) { // 3D DP and how arrays, using dynamic allocation float*** dp = malloc((size + 1) * sizeof(float**)); int*** how = malloc((size + 1) * sizeof(int**)); for (int i = 0; i <= size; i++) { dp[i] = malloc((lines_left + 1) * sizeof(float*)); how[i] = malloc((lines_left + 1) * sizeof(int*)); for (int j = 0; j <= lines_left; j++) { dp[i][j] = malloc(10 * sizeof(float)); how[i][j] = malloc(10 * sizeof(int)); for (int k = 0; k < 10; k++) { dp[i][j][k] = 1e9; how[i][j][k] = -1; } } } // Base case for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { if (j == 0) { dp[size][j][k] = 0; } } } // DP traversal for (int i = size - 1; i >= 0; i--) { for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { // Option 1: don't take the line if (k < 9) { if (dp[i + 1][j][k + 1] < dp[i][j][k]) { dp[i][j][k] = dp[i + 1][j][k + 1]; how[i][j][k] = k + 1; } } // Option 2: take the line if (j > 0) { float cost = graph[i] + (k - 8) * (k - 8); if (cost + dp[i + 1][j - 1][0] < dp[i][j][k]) { dp[i][j][k] = cost + dp[i + 1][j - 1][0]; how[i][j][k] = 0; } } } } } float result = dp[0][lines_left][6]; // Free allocated memory for (int i = 0; i <= size; i++) { for (int j = 0; j <= lines_left; j++) { free(dp[i][j]); free(how[i][j]); } free(dp[i]); free(how[i]); } free(dp); free(how); return result; } |
Running the following program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | #include <float.h> #include <stdlib.h> float solve_dp(float* graph, int size, int lines_left) { // 3D DP and how arrays, using dynamic allocation float*** dp = malloc((size + 1) * sizeof(float**)); int*** how = malloc((size + 1) * sizeof(int**)); for (int i = 0; i <= size; i++) { dp[i] = malloc((lines_left + 1) * sizeof(float*)); how[i] = malloc((lines_left + 1) * sizeof(int*)); for (int j = 0; j <= lines_left; j++) { dp[i][j] = malloc(10 * sizeof(float)); how[i][j] = malloc(10 * sizeof(int)); for (int k = 0; k < 10; k++) { dp[i][j][k] = 1e9; how[i][j][k] = -1; } } } // Base case for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { if (j == 0) { dp[size][j][k] = 0; } } } // DP traversal for (int i = size - 1; i >= 0; i--) { for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { // Option 1: don't take the line if (k < 9) { if (dp[i + 1][j][k + 1] < dp[i][j][k]) { dp[i][j][k] = dp[i + 1][j][k + 1]; how[i][j][k] = k + 1; } } // Option 2: take the line if (j > 0) { float cost = graph[i] + (k - 8) * (k - 8); if (cost + dp[i + 1][j - 1][0] < dp[i][j][k]) { dp[i][j][k] = cost + dp[i + 1][j - 1][0]; how[i][j][k] = 0; } } } } } float result = dp[0][lines_left][6]; // Free allocated memory for (int i = 0; i <= size; i++) { for (int j = 0; j <= lines_left; j++) { free(dp[i][j]); free(how[i][j]); } free(dp[i]); free(how[i]); } free(dp); free(how); return result; } #include<stdio.h> #include<stdlib.h> int main() { float arr[] = {71, 89, 34, 63, 19, 94, 54, 61, 88, 20, 66, 46, 26, 87, 55, 81, 6, 2, 72, 75, 98, 78, 24, 95, 73, 7, 56, 48, 14, 99, 64, 51, 69, 77, 28, 47, 8, 22, 49, 3, 62, 32, 10, 82, 35, 18, 85, 60, 83, 23, 5, 40, 41, 68, 53, 52, 44, 45, 65, 84, 93, 25, 13, 1, 31, 11, 12, 97, 38, 0, 43, 90, 36, 70, 33, 17, 21, 30, 16, 15, 74, 67, 58, 37, 39, 96, 79, 29, 27, 92, 86, 9, 80, 42, 57, 91, 59, 4, 76, 50}; int answer = solve_dp(arr, 100, 100); int expected = 11290; if (answer != expected) { printf("Wrong answer; got %d instead of %d.\n", answer, expected); exit(1); } printf("All tests passed\n"); } |
All tests passed
Testing if the previous output contains the string All tests passed
: True
Here's a python program. Please rewrite it in c with the type signature float solve_dp(float* arr, int size, int lines_left) def solve_dp(graph, lines_left): n = len(graph) dp = [[[1e9 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] # Initialize how as -1 indicating no decision made how = [[[-1 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] for i in range(n, -1, -1): for j in range(lines_left + 1): for k in range(10): if i == n and j == 0: dp[i][j][k] = 0 else: # Option 1: don't take the line if i < n and k < 9: if dp[i + 1][j][k + 1] < dp[i][j][k]: dp[i][j][k] = dp[i + 1][j][k + 1] how[i][j][k] = k + 1 # Representing choosing not to take the line # Option 2: take the line if i < n and j > 0: cost = graph[i] + (k - 8)**2 if cost + dp[i + 1][j - 1][0] < dp[i][j][k]: dp[i][j][k] = cost + dp[i + 1][j - 1][0] how[i][j][k] = 0 # Representing choosing to take the line # Reconstruct the solution i, j, k = 0, lines_left, 6 taken_lines = [] while i < n: if how[i][j][k] == 0: # Chose to take the line taken_lines.append(n - i) i += 1 j -= 1 k = 0 else: # Chose not to take the line i += 1 k += 1 return dp[0][lines_left][6]
Here's a python program. Please rewrite it in c with the type signature float solve_dp(float* arr, int size, int lines_left) def solve_dp(graph, lines_left): n = len(graph) dp = [[[1e9 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] # Initialize how as -1 indicating no decision made how = [[[-1 for _ in range(10)] for _ in range(lines_left + 1)] for _ in range(n + 1)] for i in range(n, -1, -1): for j in range(lines_left + 1): for k in range(10): if i == n and j == 0: dp[i][j][k] = 0 else: # Option 1: don't take the line if i < n and k < 9: if dp[i + 1][j][k + 1] < dp[i][j][k]: dp[i][j][k] = dp[i + 1][j][k + 1] how[i][j][k] = k + 1 # Representing choosing not to take the line # Option 2: take the line if i < n and j > 0: cost = graph[i] + (k - 8)**2 if cost + dp[i + 1][j - 1][0] < dp[i][j][k]: dp[i][j][k] = cost + dp[i + 1][j - 1][0] how[i][j][k] = 0 # Representing choosing to take the line # Reconstruct the solution i, j, k = 0, lines_left, 6 taken_lines = [] while i < n: if how[i][j][k] == 0: # Chose to take the line taken_lines.append(n - i) i += 1 j -= 1 k = 0 else: # Chose not to take the line i += 1 k += 1 return dp[0][lines_left][6]
Here's the equivalent C implementation with the specified type signature:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include <float.h> #include <stdlib.h> float solve_dp(float* graph, int size, int lines_left) { // Dynamically allocate 3D dp and how arrays float*** dp = malloc((size + 1) * sizeof(float**)); int*** how = malloc((size + 1) * sizeof(int**)); for (int i = 0; i <= size; i++) { dp[i] = malloc((lines_left + 1) * sizeof(float*)); how[i] = malloc((lines_left + 1) * sizeof(int*)); for (int j = 0; j <= lines_left; j++) { dp[i][j] = malloc(10 * sizeof(float)); how[i][j] = malloc(10 * sizeof(int)); for (int k = 0; k < 10; k++) { dp[i][j][k] = 1e9; how[i][j][k] = -1; } } } // Initialize base case for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { if (j == 0) dp[size][j][k] = 0; } } // Dynamic programming for (int i = size - 1; i >= 0; i--) { for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { // Option 1: don't take the line if (k < 9) { if (dp[i + 1][j][k + 1] < dp[i][j][k]) { dp[i][j][k] = dp[i + 1][j][k + 1]; how[i][j][k] = k + 1; } } // Option 2: take the line if (j > 0) { float cost = graph[i] + (k - 8) * (k - 8); if (cost + dp[i + 1][j - 1][0] < dp[i][j][k]) { dp[i][j][k] = cost + dp[i + 1][j - 1][0]; how[i][j][k] = 0; } } } } } float result = dp[0][lines_left][6]; // Free memory for (int i = 0; i <= size; i++) { for (int j = 0; j <= lines_left; j++) { free(dp[i][j]); free(how[i][j]); } free(dp[i]); free(how[i]); } free(dp); free(how); return result; } |
1 2 3 4 | float graph[] = {1.0, 2.0, 3.0, 4.0, 5.0}; int size = sizeof(graph) / sizeof(graph[0]); int lines_left = 2; float result = solve_dp(graph, size, lines_left); |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include <float.h> #include <stdlib.h> float solve_dp(float* graph, int size, int lines_left) { // Dynamically allocate 3D dp and how arrays float*** dp = malloc((size + 1) * sizeof(float**)); int*** how = malloc((size + 1) * sizeof(int**)); for (int i = 0; i <= size; i++) { dp[i] = malloc((lines_left + 1) * sizeof(float*)); how[i] = malloc((lines_left + 1) * sizeof(int*)); for (int j = 0; j <= lines_left; j++) { dp[i][j] = malloc(10 * sizeof(float)); how[i][j] = malloc(10 * sizeof(int)); for (int k = 0; k < 10; k++) { dp[i][j][k] = 1e9; how[i][j][k] = -1; } } } // Initialize base case for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { if (j == 0) dp[size][j][k] = 0; } } // Dynamic programming for (int i = size - 1; i >= 0; i--) { for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { // Option 1: don't take the line if (k < 9) { if (dp[i + 1][j][k + 1] < dp[i][j][k]) { dp[i][j][k] = dp[i + 1][j][k + 1]; how[i][j][k] = k + 1; } } // Option 2: take the line if (j > 0) { float cost = graph[i] + (k - 8) * (k - 8); if (cost + dp[i + 1][j - 1][0] < dp[i][j][k]) { dp[i][j][k] = cost + dp[i + 1][j - 1][0]; how[i][j][k] = 0; } } } } } float result = dp[0][lines_left][6]; // Free memory for (int i = 0; i <= size; i++) { for (int j = 0; j <= lines_left; j++) { free(dp[i][j]); free(how[i][j]); } free(dp[i]); free(how[i]); } free(dp); free(how); return result; } |
Running the following program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | #include <float.h> #include <stdlib.h> float solve_dp(float* graph, int size, int lines_left) { // Dynamically allocate 3D dp and how arrays float*** dp = malloc((size + 1) * sizeof(float**)); int*** how = malloc((size + 1) * sizeof(int**)); for (int i = 0; i <= size; i++) { dp[i] = malloc((lines_left + 1) * sizeof(float*)); how[i] = malloc((lines_left + 1) * sizeof(int*)); for (int j = 0; j <= lines_left; j++) { dp[i][j] = malloc(10 * sizeof(float)); how[i][j] = malloc(10 * sizeof(int)); for (int k = 0; k < 10; k++) { dp[i][j][k] = 1e9; how[i][j][k] = -1; } } } // Initialize base case for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { if (j == 0) dp[size][j][k] = 0; } } // Dynamic programming for (int i = size - 1; i >= 0; i--) { for (int j = 0; j <= lines_left; j++) { for (int k = 0; k < 10; k++) { // Option 1: don't take the line if (k < 9) { if (dp[i + 1][j][k + 1] < dp[i][j][k]) { dp[i][j][k] = dp[i + 1][j][k + 1]; how[i][j][k] = k + 1; } } // Option 2: take the line if (j > 0) { float cost = graph[i] + (k - 8) * (k - 8); if (cost + dp[i + 1][j - 1][0] < dp[i][j][k]) { dp[i][j][k] = cost + dp[i + 1][j - 1][0]; how[i][j][k] = 0; } } } } } float result = dp[0][lines_left][6]; // Free memory for (int i = 0; i <= size; i++) { for (int j = 0; j <= lines_left; j++) { free(dp[i][j]); free(how[i][j]); } free(dp[i]); free(how[i]); } free(dp); free(how); return result; } #include<stdio.h> #include<stdlib.h> int main() { float arr[] = {71, 89, 34, 63, 19, 94, 54, 61, 88, 20, 66, 46, 26, 87, 55, 81, 6, 2, 72, 75, 98, 78, 24, 95, 73, 7, 56, 48, 14, 99, 64, 51, 69, 77, 28, 47, 8, 22, 49, 3, 62, 32, 10, 82, 35, 18, 85, 60, 83, 23, 5, 40, 41, 68, 53, 52, 44, 45, 65, 84, 93, 25, 13, 1, 31, 11, 12, 97, 38, 0, 43, 90, 36, 70, 33, 17, 21, 30, 16, 15, 74, 67, 58, 37, 39, 96, 79, 29, 27, 92, 86, 9, 80, 42, 57, 91, 59, 4, 76, 50}; int answer = solve_dp(arr, 100, 100); int expected = 11290; if (answer != expected) { printf("Wrong answer; got %d instead of %d.\n", answer, expected); exit(1); } printf("All tests passed\n"); } |
All tests passed
Testing if the previous output contains the string All tests passed
: True