寒假每日一题打卡day21——AcWing 1015. 摘花生

【题目描述】
在这里插入图片描述在这里插入图片描述
AcWing 1015. 摘花生

【错误代码】
使用贪心策略并不能得到全局最优,注意在 数字三角形那道题是对每种策略都进行了求解。
使用如下代码并不能AC,会发现得到的答案数目是小于等于正确数的。

import java.io.*;
class Main{
    static int M = 110, N = 110;
    public static int solve(int q[][],int m, int n){
        int i = m, j =n;
        int ans = q[m][n];
        while( i != 1 && j != 1){
            if(i - 1 <=0){
                ans += q[i][j - 1];
                j = j -1;
            }else if( j - 1 <=0){
                ans += q[i - 1][j];
                i = i - 1;
                
            }else if(q[i - 1][j] >= q[i][j - 1]){
                ans += q[i - 1][j];
                i = i - 1;
            }else{
                ans += q[i][j - 1];
                j = j - 1;
            }
        }
        ans += q[1][1];
        return ans;
        
        
    }
    public static void main(String args[]) throws Exception{
        BufferedReader bf= new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));
        int T = Integer.parseInt(bf.readLine());
        while(T-- > 0){
            String str[] = bf.readLine().split(" ");
            int R = Integer.parseInt(str[0]), C = Integer.parseInt(str[1]);
            int q[][] = new int[ M ][ N ];
            for(int i = 1; i <= R; i++){
                String s[] = bf.readLine().split(" ");
                for(int j = 1; j <= C; j++) q[i][j] = Integer.parseInt(s[ j -1 ]);
            }
            int ans = solve(q, R, C);
            log.write(ans+"");
            log.write("\n");
        }
        log.flush();
        log.close();
        bf.close();
    }
}

【正解】

在这里插入图片描述

import java.io.*;
class Main{
    static int M = 110, N = 110;
    
    public static void main(String args[]) throws Exception{
        BufferedReader bf= new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));
        int T = Integer.parseInt(bf.readLine());
        while(T-- > 0){
            String str[] = bf.readLine().split(" ");
            int R = Integer.parseInt(str[0]), C = Integer.parseInt(str[1]);
            int q[][] = new int[ M ][ N ];
            for(int i = 1; i <= R; i++){
                String s[] = bf.readLine().split(" ");
                for(int j = 1; j <= C; j++) q[i][j] = Integer.parseInt(s[ j -1 ]);
            }
            int f[][] = new int[ M ][ N];
            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]) + q[i][j];
            log.write(f[R][C]+"");
            log.write("\n");
        }
        log.flush();
        log.close();
        bf.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值