您的位置:首页 > 其它

数字三角形问题

2013-12-08 18:52 197 查看
描述:给定一个由n 行数字组成的数字三角形(例如下图)。输出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。

public class RecMaxNum{

public static int getRecMaxNum(int[][] rec){
/*
m[i][j]: the max value path which is ended of rec[i][j]
pre[i][j]: the note of pre value index
*/
int n = rec.length;
int[][] m = new int

;
int[][] pre = new int

;
//init
m[0][0] = rec[0][0];
//dynamic programming
for(int i = 1; i < n; i ++){
m[i][0] = m[i-1][0] + rec[i][0];
pre[i][0] = 1;
for(int j = 1; j < i; j ++){
if(m[i-1][j] + rec[i][j] < m[i-1][j-1] + rec[i][j]){
m[i][j] = m[i-1][j-1] + rec[i][j];
pre[i][j] = -1;
}
else{
m[i][j] = m[i-1][j] + rec[i][j];
pre[i][j] = 1;
}
}
m[i][i] = m[i-1][i-1] + rec[i][i];
pre[i][i] = -1;
}
int k = 0;
for(int j = 1; j < n; j ++){
if(m[n-1][k] < m[n-1][j]){
k = j;
}
}
//build the path
StringBuffer s = new StringBuffer("");
for(int i = n-1, j = k; i >= 0 && j >= 0;){
s.insert(0, Integer.toString(rec[i][j]) + " ");
if(pre[i][j] == -1){
i --;
j --;
}
else{
i --;
}
}
System.out.println(s);
return m[n-1][k];
}

public static void main(String[] args) {
int[][] rec = new int[5][5];
for(int i = 0; i < 5; i ++){
for(int j = 0; j <= i; j ++){
rec[i][j] = (int)(Math.random() * 10);
System.out.print(rec[i][j] + " ");
}
System.out.println();
}
System.out.println(getRecMaxNum(rec));
}

}


Java
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: