Day01
898.数字三角形
import java.util.*;
public class Main{
static int[][] w=new int[510][510];
static int[][] f=new int[510][510];
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
//读入
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
w[i][j]=sc.nextInt();
}
}
f[1][1]=w[1][1];
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++){
if(i==j) f[i][j]=f[i-1][j-1]+w[i][j];//每行末尾
else if(j==1) f[i][j]=f[i-1][1]+w[i][j];//每行开头
else f[i][j]=Math.max(f[i-1][j],f[i-1][j-1])+w[i][j];
}
}
int max=-0x3f3f3f3f;
for(int i=1;i<=n;i++){
if(max<f[n][i]) max=f[n][i];
}
System.out.println(max);
}
}
1015.摘花生
import java.util.*;
public class Main{
static int[][] w=new int[110][110];
static int[][] f=new int[110][110];
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();
while(T--!=0){
//读入
int r=sc.nextInt(),c=sc.nextInt();
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
w[i][j]=sc.nextInt();
}
}
//dp
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
f[i][j]=Math.max(f[i-1][j],f[i][j-1])+w[i][j];
}
}
System.out.println(f[r][c]);
}
}
}
1018.最低通行费
import java.util.*;
public class Main{
static int[][] w=new int[110][110];
static int[][] f=new int[110][110];
static int INF=0x3f3f3f3f;
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
//读入
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
w[i][j]=sc.nextInt();
}
}
//处理边界
for(int i=0;i<=n;i++){
f[0][i]=INF;
f[i][0]=INF;
}
//dp
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==1&&j==1) f[1][1]=w[1][1];
else f[i][j]=Math.min(f[i-1][j],f[i][j-1])+w[i][j];//状态转方程
}
}
System.out.println(f[n][n]);
}
}
1027.方格取数
import java.util.*;
public class Main{
static int[][] w=new int[11][11];
static int[][][] f=new int[11*2][11][11];
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int a,b,c;
do{
a=sc.nextInt();b=sc.nextInt();c=sc.nextInt();
w[a][b]=c;
}while(a!=0&&b!=0&&c!=0);
for(int k=2;k<=n*2;k++){
for(int i1=1;i1<=n;i1++){
for(int i2=1;i2<=n;i2++){
int j1=k-i1,j2=k-i2;
if(j1>=1&&j2>=1&&j2<=n&&j1<=n){
int t=w[i1][j1];
if(i1!=i2) t+=w[i2][j2];
f[k][i1][i2]=Math.max(f[k][i1][i2],f[k-1][i1][i2]+t); //左左
f[k][i1][i2]=Math.max(f[k][i1][i2],f[k-1][i1][i2-1]+t);//左上
f[k][i1][i2]=Math.max(f[k][i1][i2],f[k-1][i1-1][i2]+t);//上左
f[k][i1][i2]=Math.max(f[k][i1][i2],f[k-1][i1-1][i2-1]+t);//上上
}
}
}
}
System.out.println(f[n*2][n][n]);
}
}