1,牛客网第一题:这其实跟找最长递增子序列是一个东西。注意的地方是,返回的是最大的dp,而不是dp[N-1]。
答案:
public static int getHeight(int[] men, int n) { // write code here int res = 0; int[] dp = new int[n]; dp[0] = 1; for(int i =1;i <n;i++){ int max = 0; for(int j =0;j < i;j++){ if(men[j] < men[i]){ max = Math.max(max, dp[j]); } } dp[i] = max + 1; res = Math.max(res, dp[i]); } return res; }
2牛客网第二题:多了一个条件,身高,那就先对单一元素排序,在进行dp。
public static int getHeight(int[][] men, int n) { // write code here for (int i = 0; i < n; i ++) { for (int j = 1; j < n - i; j ++) { if (men[j][0] < men[j-1][0]) { int temp = men[j][0]; men[j][0] = men[j-1][0]; men[j-1][0] = temp; int temp1 = men[j][1]; men[j][1] = men[j-1][1]; men[j-1][1] = temp1; } } } System.out.println(men[1][0]); int res = 0; int[] dp = new int[n]; dp[0] = 1; for(int i =1;i <n;i++){ int max = 0; for(int j =0;j < i;j++){ if( men[j][1] < men[i][1]){ max = Math.max(max, dp[j]); } } dp[i] = max + 1; res = Math.max(res, dp[i]); } return res; }