AcWing 1027. 方格取数java
原题链接
简单
作者:
季之秋
,
2021-03-02 22:43:38
,
所有人可见
,
阅读 309
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int N=15;
int g[][]=new int[N][N];
int f[][][]=new int[N*2][N][N]; //用k来表示两个坐标的和是相等的,并且可以遍历到每个坐标
while(true){
int a=sc.nextInt();
int b=sc.nextInt();
int c=sc.nextInt();
if(a==0&&b==0&&c==0) break;
g[a][b]=c;
}
for(int k=2;k<=n*2;k++){ //最多取到n+n
for(int i1=1;i1<=n;i1++){ //最多取到max(k,n);
for(int i2=1;i2<=n;i2++){
int j1=k-i1,j2=k-i2;
if(j1>=1&&j1<=n&&j2>=1&&j2<=n){ //有一个点出界代表f[k][i1][i2]是无效的
int t=g[i1][j1]; //最少加一个数
if(i1!=i2&&j1!=j2) t+=g[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-1][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][i2-1]+t);//左 上
}
}
}
}
System.out.println(f[n*2][n][n]); //两点坐标和是n+n,并且x是n,所以y也是n 就是两个(n,n)的最大值
}
}