蓝桥国赛抱佛腿系列:算法训练 拿金币

211 阅读1分钟

问题描述

  有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。

输入格式

  第一行输入一个正整数n。
以下n行描述该方格。金币数保证是不超过1000的正整数。

输出格式

  最多能拿金币数量。

样例输入

3
1 3 3
2 2 2
3 1 2

样例输出

11

数据规模和约定

  n<=1000

Java代码

import java.util.Scanner;


public class Main {

    private static int[][] arr;
    private static int n;
    public static void f(int i,int j){
//        0 0 0 1 1 0
        if(i==0&&j==0){
            return;
        }
        if(i==0 & j!=0){
            arr[i][j] = arr[i][j-1]+arr[i][j];
        }
        if(i!=0 & j==0){
            arr[i][j] = arr[i-1][j]+arr[i][j];
        }
        if(i!=0&j!=0){
            arr[i][j] = Math.max(arr[i][j-1]+arr[i][j],arr[i-1][j]+arr[i][j]);
        }

//        arr[i][j] 左arr[i][j+1] 下arr[i+1][j]
        //右边走
    }

    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        n = scanner.nextInt();
        arr=new int[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                arr[i][j] = scanner.nextInt();
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                f(i,j);
            }
        }
        System.out.print(arr[n-1][n-1]);


    }
}