##编程日记 动态规划问题:拿金币

##编程日记 动态规划问题:拿金币
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。
输入格式
第一行输入一个正整数n。
以下n行描述该方格。金币数保证是不超过1000的正整数。
输出格式
最多能拿金币数量。
样例输入
3
1 3 3
2 2 2
3 1 2
样例输出
11
数据规模和约定
n<=1000

思路:这是一个动态规划问题,所谓动态规划,以我的理解是以后一个子问题的最优解作为当前问题的条件,以此递归求总问题的最优解。也可以这么解释:“倒过来的最优问题”,从最后一直向前求最优。
解析:
求最多金币数量,看的是整体相加最大,因为看到只能在下和右来进行移动所以这可以是一个动态规划问题,最下或者最右作为边界条件。
代码:

import java.util.Scanner;

public class WinterVacation08 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int a=scanner.nextInt();
        int[][] ints=new int[a][a];
        int[][] ints1=new int[a][a];
        for (int i=0;i<a;i++){
            for (int j=0;j<a;j++){
                ints[i][j]=scanner.nextInt();
                ints1[i][j]=-1;
            }
        }
        //动态规划问题
        System.out.println(MaxSum(0,0,a,ints,ints1));
    }
    public static int MaxSum(int i,int j,int a,int[][] ints,int[][] ints1){
        if (ints1[i][j]!=-1){
            return ints1[i][j];//动态规划精髓:减少计算次数
        }else if (i==a-1&&j==a-1) {
            return ints[i][j];
        }else if (i==a-1&&j<a-1){
            return MaxSum(i,j+1,a,ints,ints1)+ints[i][j];
        }else if (j==a-1&&i<a-1){
            return MaxSum(i+1,j,a,ints,ints1)+ints[i][j];
        }else {
            int x=MaxSum(i+1,j,a,ints,ints1);
            int y= MaxSum(i,j+1,a,ints,ints1);
            ints1[i][j]=Math.max(x,y)+ints[i][j];
            return Math.max(x,y)+ints[i][j];
        }
    }
}

这个答案并不是特别正确,但是我感觉思路是正确的,100分的测试只有70分,另外是内存消耗大,具体答案还希望各位童鞋给出!!!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值