题目描述
- 在数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。
题目解析
- dfs思想;每次加上最大的一个
- dp思想dp[i]代表,每一行第i个位置最大加数,从最后一行开始,与递归方式相反
代码
static int[][] ans;
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int N=scanner.nextInt();
ans=new int[N][N];
for (int i = 0; i < ans.length; i++) {
Arrays.fill(ans[i], -1);
}
int[][] tangle=new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j <= i; j++) {
tangle[i][j]=scanner.nextInt();
}
}
findAnsByDp(tangle);
System.out.println(dfs2(tangle,0,0));
}
private static void findAnsByDp(int[][] tangle) {
int[] dp=new int[tangle.length];
for (int i = 0; i < tangle[tangle.length-1].length; i++) {
dp[i]=tangle[tangle.length-1][i];
}
for (int i = tangle.length-2; i >=0; i--) {
for (int j = 0; j <=i; j++) {
dp[j]=max(dp[j]+tangle[i][j], dp[j+1]+tangle[i][j]);
}
}
System.out.println(dp[0]);
}
private static int dfs(int[][] tangle, int x, int y) {
if(x==tangle.length-1) {
return tangle[x][y];
}else {
return tangle[x][y]+max(dfs(tangle, x+1, y),dfs(tangle, x+1, y+1));
}
}
private static int dfs2(int[][] tangle, int x, int y) {
if(x==tangle.length-1) {
ans[x][y]=tangle[x][y];
return tangle[x][y];
}else {
if (ans[x+1][y]==-1&&ans[x+1][y]==-1) {
ans[x+1][y]=dfs(tangle, x+1, y);
ans[x+1][y+1]=dfs(tangle, x+1, y+1);
}
return tangle[x][y]+max(ans[x+1][y],ans[x+1][y]);
}
}
private static int max(int dfs, int dfs2) {
if(dfs>=dfs2)
return dfs;
return dfs2;
}