# SUMTRIAN - implementing memoization

I have spent many hours trying to solve the SUMTRIAN problem (http://www.codechef.com/problems/SUMTRIAN/) I know how my program works, I am implementing recursion, and I am doing my best to implement memoization (this is new for me). The code works perfectly fine for small triangles. However, every submission to CodeChef exceeds the time limit. Can anyone give me any pointers, please?

Thanks,

public class Main {

``````private static int[][] triangle = new int[0][0];
private static int[][] computedPaths = new int[0][0]; //for memoization

public static void main(String[] args){

java.util.Scanner input = new java.util.Scanner(System.in);

int cases = input.nextInt();

int[] solutions = new int[cases];
int solutionsIndex = 0;

for(int i = 0; i < cases; i += 1){//for each triangle

int lines = input.nextInt();
triangle = new int[lines][lines];
computedPaths = new int[lines][lines];

int level = 1; //top of triangle is level 1 and level increases as works towards base

for(int y = 0; y < lines; y += 1){
for(int x = 0; x < level; x += 1){
triangle[y][x] = input.nextInt();
}
level += 1;
}

//save outputs in array until all inputs are processed
solutions[solutionsIndex] = findGreatestRouteValueRecursively(0,0);
solutionsIndex += 1;
}

for(int i = 0; i < solutions.length; i += 1){
System.out.println(solutions[i]);
}

}//end main

public static int findGreatestRouteValueRecursively(int y, int x){
if(y >= triangle.length)
return 0;
else if(computedPaths[y][x] == 0){
int value1 = findGreatestRouteValueRecursively(y+1, x);
int value2 = findGreatestRouteValueRecursively(y+1, x+1);
computedPaths[y][x] = Math.max(value1, value2) + triangle[y][x];
}
return computedPaths[y][x];

}//end findGreatestRouteValueRecursively()
}``````

bump - any tips on how to memoize this would be greatly appreciated! the only code to rly look at is the findGreatestRouteValueRecursively at the bottom

Solved - for anyone curious, what made the difference was changing my input from Scanner to BufferedReader and InputStreamReader. Lesson learned

Code below:
public class SumsInATriangle {

``````private static int[][] triangle = new int[0][0];
private static int[][] computedPaths = new int[0][0]; //for memoization

public static void main(String[] args) throws java.io.IOException{

int cases = Integer.parseInt(in[0]);

int[] solutions = new int[cases];
int solutionsIndex = 0;

for(int i = 0; i < cases; i += 1){//for each triangle

int lines = Integer.parseInt(in[0]);
triangle = new int[lines][lines];
computedPaths = new int[lines][lines];

int level = 1; //top of triangle is level 1 and level increases as works towards base

for(int y = 0; y < lines; y += 1){
for(int x = 0; x < level; x += 1){
triangle[y][x] = Integer.parseInt(in[x]);
}
level += 1;
}

//save outputs in array until all inputs are processed
solutions[solutionsIndex] = findGreatestRouteValueRecursively(0,0);
solutionsIndex += 1;
}

for(int i = 0; i < solutions.length; i += 1){
System.out.println(solutions[i]);
}

//		int level = 1; //print triangle
//		for(int y = 0; y < triangle[0].length; y += 1, level += 1){
//			for(int x = 0; x < level; x += 1){
//				System.out.print(triangle[y][x] + " ");
//			}
//			System.out.println();
//		}
}//end main

public static int findGreatestRouteValueRecursively(int y, int x){
if(y >= triangle.length)
return 0;
else if(computedPaths[y][x] == 0){
int value1 = findGreatestRouteValueRecursively(y+1, x);
int value2 = findGreatestRouteValueRecursively(y+1, x+1);
computedPaths[y][x] = Math.max(value1, value2) + triangle[y][x];
}
return computedPaths[y][x];

}//end findGreatestRouteValueRecursively()
``````

}//end class