大家好 我是寸铁 希望这篇题解对你有用,麻烦动动手指点个赞或关注,感谢您的关注
注意
像数组下标出现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);}
}