void bubble_sort(int[][] arr, int n) { for (var i = 0; i < n-1; i = i+1;) { for (var j = 0; j < n-i-1; j = j+1;) { if ((arr[j][0] > arr[j+1][0]) | ((arr[j][0] == arr[j+1][0]) & (arr[j][1] < arr[j+1][1])) ) { var temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } } } return; } int longest_increasing_subsequence(int[] arr, int n) { 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_envelopes(int[][] envelopes, int n) { bubble_sort(envelopes, n); var heights = new int[n]; for (var i = 0; i < n; i = i+1;) { heights[i] = envelopes[i][1]; } return longest_increasing_subsequence(heights, n); } int program(int argc, string[] argv) { var envelopes = new int[][] { new int[] {5, 4}, new int[] {6, 4}, new int[] {6, 7}, new int[] {2, 3} }; var n = 4; var res = max_envelopes(envelopes, n); return res; }