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