我正在研究Euler项目的问题,我对问题11的解决方案并不满意。有没有办法可以用更少的步骤或更快的速度遍历矩阵?或者一般来说,有更好的方法来解决它吗?
numbers.txt是问题11中给出的数字矩阵。
http://projecteuler.net/problem=11
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Project {
public static void main(String[] args){
int [][] matrix = new int [20][20];
populateMatrix(matrix, "numbers.txt");
System.out.println( greatestProduct(matrix) );
}
public static long greatestProduct(int [][] matrix){
final int NUMBER = 4;
final int LIMIT = matrix.length - NUMBER;
long max = 0;
for(int i= 0; i < matrix.length; i++){
for(int j= 0; j <= LIMIT; j++){
long diagTrack = 1, diagTrack2 = 1, horTrack = 1, horTrack2 = 1;
int y = j;
int x = i;
int r = matrix.length-i-1;
for(int index =0; index<NUMBER; index++){
if(i <= LIMIT){
diagTrack *= matrix[x][y];
diagTrack2*= matrix[r][y];
x++;
r--;
}
horTrack *= matrix[i][y];
horTrack2*= matrix[y][i];
y++;
}
if(max < diagTrack) max = diagTrack;
if(max < diagTrack2) max = diagTrack2;
if(max < horTrack) max= horTrack;
if(max < horTrack2) max = horTrack2;
}
}
return max;
}
public static void populateMatrix(int [][] matrix, String fileName){
File file = new File(fileName);
try {
Scanner scanner = new Scanner(file);
for(int i= 0; scanner.hasNextLine(); i++) {
String line[] = ( (String) scanner.nextLine() ).split(" ");
for(int j= 0; j < line.length; j++)
matrix[i][j]= Integer.parseInt(line[j].trim() );
}
scanner.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:0)
如果你有的话,我能想到的一件事就是使用事实 a,b,c,d,e,f你可以通过
获得所有这些值val1 = a*b*c*d
val2 = val1*e/a
val3 = val2*f/b
但由于分区相当昂贵,我认为这比2次乘法更糟糕。 可能会有一些其他的超级技巧,而不会使代码变得更复杂。例如。
If a>e than a*b*c*d > b*c*d*e
但那只是复杂的矫枉过正。让我们假设由于某种原因乘法很慢。这不是通过备忘录实现的,而是表达出来的。
a*b*c*d = multiply(a,b)*multiply(c,d)
最后我认为实际上乘法的速度和存储速度一样快,如果不是更快就能从中读取,这意味着你的方法与其他任何东西一样好,但最重要的是,这种天真的解决方案可以很容易实现。