acwing_1015 摘花生

94 阅读1分钟

###题目连接

  • 思路 :
  •        //状态表示 :f[i][j]  表示 从 (0,0) 开始 选择东或者南方的花生的所有方案  属性 max
          // 决策 : 选择 东 : f[i][j] += f[i - 1][j] + g[i][j];
         //           选择 南 : f[i][j] += f[i][j - 1] + g[i][j];
         // 都是 + g[i][j] , 决策 取 max 可以写为 f[i][j] = max(f[i - 1][j] , f[i][j - 1] ) + g[i][j];
         
    
import java.util.*;

public class Main {
    static int[] dx = {1,0};
    static int[] dy = {0,-1};
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        while (t -- > 0) {
            int r = sc.nextInt();
            int c = sc.nextInt();
            int[][] g = new int[r + 1][c + 1 ];
            for(int i = 1 ; i <= r ;  i ++ ){
                for (int j = 1; j <= c ; j++ ) 
                g[i][j] = sc.nextInt();
            }
            
            // 状态表示 :f[i][j]  表示 从 (1,1) 开始 选择东或者南方的花生的所有方案  属性 max
            // 决策 : 选择 东 : f[i][j] += f[i - 1][j] + g[i][j];
           //           选择 南 : f[i][j] += f[i][j - 1] + g[i][j];
           // 都是 + g[i][j] , 决策 取 max 可以写为 f[i][j] = max(f[i - 1][j] , f[i][j - 1] ) + g[i][j];
           int[][] f = new int[r + 1][c + 1];
           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]) + g[i][j];
           }
           System.out.println(f[r][c]);
        }
        
    }
    
}

优化 : 滚动数组法

import java.util.*;

public class Main {
    static int[] dx = {1,0};
    static int[] dy = {0,-1};
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        while (t -- > 0) {
            int r = sc.nextInt();
            int c = sc.nextInt();
            int[][] g = new int[r + 1][c + 1 ];
            for(int i = 1 ; i <= r ;  i ++ ){
                for (int j = 1; j <= c ; j++ ) 
                g[i][j] = sc.nextInt();
            }
            
            // 状态表示 :f[i][j]  表示 从 (1,1) 开始 选择东或者南方的花生的所有方案  属性 max
            // 决策 : 选择 东 : f[i][j] += f[i - 1][j] + g[i][j];
           //           选择 南 : f[i][j] += f[i][j - 1] + g[i][j];
           // 都是 + g[i][j] , 决策 取 max 可以写为 f[i][j] = max(f[i - 1][j] , f[i][j - 1] ) + g[i][j];
           int[]f = new int[c + 1];
           for (int i = 1 ; i <= r ; i ++) {
               for (int j = 1 ; j <= c ; j ++) 
                    f[j] = Math.max(f[j] , f[j - 1]) + g[i][j];
           }
           System.out.println(f[c]);
        }
        
    }
    
}