public static int minimumTotal(ArrayList<ArrayList<Integer>> triangle){
		
		
		if (triangle == null || triangle.size() == 0){
            return 0;
        }
       
		
        int size = triangle.size();
        int[][] min = new int[size][size];
        
        for (int i = 0; i < size; i++){
        	for (int j = 0; j < size; j++){
        		min[i][j] = Integer.MAX_VALUE;
        	}
        }
        
        //initialize
        min[0][0] = triangle.get(0).get(0);
        
        for (int i = 1; i < size; i++){
            for (int j = 0; j <= i; j++){
            	if (j == 0){
            		min[i][j] = min[i-1][j] + triangle.get(i).get(j);
            	} else {
            		//function
                    min[i][j] = Math.min(min[i - 1][j], min[i - 1][j - 1]) 
                    + triangle.get(i).get(j);
            	}
     
            }
        }
        //result
        int mini = Integer.MAX_VALUE;
        for (int i = 0; i < size; i++){
            mini = Math.min(min[size - 1][i], mini);
        }
        
        System.out.println(min[1][1]);
        
//        for (int i = 1; i < size; i++){
//            for (int j = 1; j <= i; j++){
//                System.out.print(min[i][j]+" ");
//            }
//            System.out.println();
//        }
        
        return mini;
	}