題目的大體意思以下:java
輸入N組數,一組數表明一個父子對(如,0 1,0表明父節點,1表明子節點),求這N組數所組成的二叉樹的高度;數組
例如:spa
輸入:6code
0 1blog
0 2it
1 3class
1 4import
2 5二叉樹
3 6im
輸出:4
解題思路:動態規劃法,使用一個數組hight[N]記錄每組數所能組成的二叉樹的高度,初始化爲全1數組,使用一個數組visited[N]來記錄每組數的訪問狀況,找出最優子結構:
當visited[i]=0時,visited[i]=1,hight[i] = hight[i]+1;
而後,當matrix[j][0]=matrix[i][1]且visited[j]=0時,hight[j] = hight[i]+1,visited[j]=1;
代碼以下:
import java.util.Scanner; public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); while(scanner.hasNext()){ int groups = scanner.nextInt(); int[][] matrix = new int[groups][2];for(int i=0;i<groups;i++){ for(int j=0;j<2;j++){ matrix[i][j] = scanner.nextInt(); } }
//動態規劃輸出處理
System.out.println(maxHightHelper(matrix));
} }//動態規劃 public static int maxHightHelper(int[][] matrix){ if(matrix==null||matrix.length==0) return 0; //記錄當前組的高度 int[] hight = new int[matrix.length]; for(int i=0;i<hight.length;i++) hight[i] = 1; byte[] visited = new byte[matrix.length]; for(int i=0;i<matrix.length;i++){ if(visited[i]==0){ visited[i] = 1; hight[i] = hight[i]+1; } for(int j=i+1;j<matrix.length;j++){ if(matrix[j][0]==matrix[i][1]&&visited[j]==0){ visited[j] = 1; hight[j] = hight[i] +1; } } } //找最大的高度 int max = 0; for(int i=0;i<hight.length;i++){ if(max<hight[i]) max = hight[i]; } return max; } }