- import java.io.File;
- import java.io.FileNotFoundException;
- import java.util.HashMap;
- import java.util.Scanner;
- public class main {
- static final String inputFileName = "input.txt"; //input file name which in current directory
- static HashMap<Integer,Boolean> primeList = new HashMap<>(); //create hashmap for keep prime number
- public static void main(String[] args) {
- int line = getTriangleLength(); //determine triangle height
- int arraySize = (line * (line + 1)) / 2; // calculate enough space for keep triangle
- int[] triangle = new int[arraySize]; //create array for keep inputs
- int[] dynamicTriangle; // create dynamic array for use dynamic iterations.
- int[] indexTable = new int[line]; // indexTable keeps start index for each line.
- fillTriangle(triangle); // read input from file and fill arrays
- dynamicTriangle = triangle.clone();
- fillIndexTable(indexTable,line);
- eliminateInvalidPaths(triangle,dynamicTriangle,indexTable,line);
- int maxSum = findMaxSum(dynamicTriangle,indexTable,line); //calculate maxSum
- System.out.println(maxSum);
- }
- static int findMaxSum(int[] dynamicTriangle,int[] indexTable,int size){
- int leftChild;
- int rightChild;
- int index;
- for (int i = size-1; i > 0 ; i--) {
- for (int j = 0; j <i ; j++) {
- index =indexTable[i];
- leftChild = dynamicTriangle[index+j];
- rightChild = dynamicTriangle[index+j+1];
- dynamicTriangle[index+j-i] += Math.max(leftChild,rightChild);
- }
- }
- return dynamicTriangle[0];
- }
- static void eliminateInvalidPaths(int[] triangle,int[] dynamicTriangle,int[] indexTable,int size){
- boolean leftChild=false;
- int index;
- for (int i = size-1; i > 0 ; i--) {
- for (int j = 0; j <i ; j++) {
- index =indexTable[i];
- if(isPrime(triangle[index+j])){
- dynamicTriangle[index+j]=0;
- if(leftChild) dynamicTriangle[index+j-i-1]=0;
- leftChild=true;
- continue;
- }
- leftChild=false;
- }
- leftChild=false;
- }
- }
- static boolean isPrime(int key){
- if (primeList.containsKey(key)){
- return primeList.get(key);
- }
- for(int i=2;i<=Math.sqrt(key);i++){
- if(key%i==0){
- return false;
- }
- }
- primeList.put(key,true);
- return true;
- }
- static int getTriangleLength(){
- int lineCounter = 0;
- File file =
- new File(inputFileName);
- try {
- Scanner sc = new Scanner(file);
- while (sc.hasNextLine()){
- lineCounter++;
- sc.nextLine();
- }
- }catch (FileNotFoundException e){
- e.printStackTrace();
- }
- return lineCounter;
- }
- static void fillTriangle(int[] triangle){
- int index=0;
- File file =
- new File(inputFileName);
- try {
- Scanner sc = new Scanner(file);
- while (sc.hasNextInt()){
- triangle[index] = sc.nextInt();
- index++;
- }
- }catch (FileNotFoundException e){
- e.printStackTrace();
- }
- }
- static void fillIndexTable(int[] indexTable,int size){
- for (int i = 0; i <size ; i++) {
- indexTable[i] = (i*(i+1))/2;
- }
- }
- }