CS153/hw6/hw5programs/sp22_tests/russian_nesting_dolls.oat
jmug ee01a8f5b2 Change hw6 to an unsolved version.
Signed-off-by: jmug <u.g.a.mariano@gmail.com>
2025-01-24 23:10:01 -08:00

73 lines
No EOL
1.5 KiB
Text

struct Doll {
int height;
int width
}
bool compare_dolls(Doll d1, Doll d2) {
if (d1.height > d2.height |
d1.height == d2.height & d1.width < d2.width) {
return true;
}
return false;
}
void bubble_sort(Doll[] arr, (Doll, Doll) -> bool compare) {
var n = length(arr);
for (var i = 0; i < n-1; i = i+1;) {
for (var j = 0; j < n-i-1; j = j+1;) {
if (compare(arr[j], arr[j + 1])) {
var temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return;
}
int longest_increasing_subsequence(int[] arr) {
var n = length(arr);
var dp = new int[n];
var max_subsequence = 0;
for (var i = 0; i < n; i = i+1;) {
dp[i] = 1;
var max_seq = 0;
for (var j = 0; j < i; j = j+1;) {
if (arr[i] > arr[j] & dp[j] > max_seq) {
max_seq = dp[j];
}
}
dp[i] = max_seq + 1;
if (dp[i] > max_subsequence) {
max_subsequence = dp[i];
}
}
return max_subsequence;
}
int max_russian_nesting_dolls((Doll[], (Doll, Doll) -> bool) -> void sorting_fn, Doll[] dolls) {
sorting_fn(dolls, compare_dolls);
var heights = new int[length(dolls)] {
i -> dolls[i].width
};
return longest_increasing_subsequence(heights);
}
int program(int argc, string[] argv) {
var dim_arr = new int[][] {
new int[] {5, 4},
new int[] {6, 4},
new int[] {6, 7},
new int[] {2, 3}
};
var dolls = new Doll[length(dim_arr)] {
i -> new Doll { height = dim_arr[i][0]; width = dim_arr[i][1] }
};
var res = max_russian_nesting_dolls(bubble_sort, dolls);
return res;
}