大家好 我是寸铁 希望这篇题解对你有用,麻烦动动手指点个赞或关注,感谢您的关注
注意
像数组下标出现i-1的,在循环的时候从i=1开始。
关于0x3f3f3f3f和Integer.MAX_VALUE
0x3f3f3f3f:1061109567
 Integer.MAX_VALUE:2147483647
 在选用Integer.MAX_VALUE时,很可能会出现数据溢出。
 所以在用Integer.MAX_VALUE时需要先取MAX再加a[i][j];
边界值初始化

注:做数字三角形这题时,初始化时需要注意一下边界。
 由于我们状态计算时,是计算左上和右下的方向的最大值。
 在边界时0(左上)、j+1(右下)需要进行初始化。
 我们在初始化每一个点的状态即f[i][j]时需要多初始化两个点。
 即每一行下标分别是0一个是j+1。
模板1(INF取0x3f3f3f3f)
import java.util.*;
public class Main{static int N=510,INF=0x3f3f3f3f;static int a[][]=new int[N][N];static int f[][]=new int[N][N];public static void main(String []args){Scanner in = new Scanner(System.in);int n=in.nextInt();for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){a[i][j]=in.nextInt();}}for(int i=0;i<=n;i++){for(int j=0;j<=i+1;j++){f[i][j]=-INF;}}f[1][1]=a[1][1];for(int i=2;i<=n;i++){for(int j=1;j<=i;j++){f[i][j]=Math.max(f[i-1][j-1]+a[i][j],f[i-1][j]+a[i][j]);    }}long res=-INF;for(int i=1;i<=n;i++){res=Math.max(res,f[n][i]);}System.out.println(res);}
}
模板2(INF取MAX_Integer)
注:
import java.util.*;
public class Main{static int N=510,INF=Integer.MIN_VALUE;static int a[][]=new int[N][N];static int f[][]=new int[N][N];public static void main(String []args){Scanner in = new Scanner(System.in);int n=in.nextInt();for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){a[i][j]=in.nextInt();}}for(int i=0;i<=n;i++){for(int j=0;j<=i+1;j++){f[i][j]=-INF;}}f[1][1]=a[1][1];///注意初始化for(int i=2;i<=n;i++){for(int j=1;j<=i;j++){f[i][j]=Math.max(f[i-1][j-1],f[i-1][j])+a[i][j];    }}long res=-INF;for(int i=1;i<=n;i++){res=Math.max(res,f[n][i]);}System.out.println(res);}
}