首页 > 试题广场 >

米兔收集胡萝卜

[编程题]米兔收集胡萝卜
  • 热度指数:1380 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

现在有一个的格子,第行第列的格子有个胡萝卜。
现在米兔要从左上角的格子走到右下角的格子,来收集这些胡萝卜。并且每次只能向右或者向下走。
请计算米兔能够收集到的最大胡萝卜数量。

示例1

输入

[[0,1],[1,1]]

输出

2

说明

先向右走再向下走
示例2

输入

[[1,4,9],[3,5,9]]

输出

23

说明

向右走2步再向下走1步

备注:


class Solution:
    def maxPathSum(self , a ):
        cols=len(a[0])
        rows=len(a)
        for i in range(1,cols):
            a[0][i]=a[0][i-1]+a[0][i]
        for i in range(1,rows):
            a[i][0]=a[i-1][0]+a[i][0]      
        for i in range(1,rows):
            for j in range(1,cols):
                a[i][j]=max(a[i-1][j], a[i][j-1])+a[i][j]
        return a[rows-1][cols-1]

发表于 2021-09-08 15:53:49 回复(1)
动态规划模板题,对于位置(i,j),可能从上边(i-1,j)或左边(i,j-1)到达,因此该位置的最大胡萝卜数应该为(i-1,j)和(i,j-1)两个位置最优解的较大值加上本位置的胡萝卜数。而为了优化空间复杂度,直接在原二维数组上进行操作。
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param a int整型二维数组 
     * @return int整型
     */
    public int maxPathSum (int[][] a) {
        // write code here
        int rows = a.length, cols = a[0].length;
        for(int j = 1; j < cols; j++) a[0][j] += a[0][j - 1];
        for(int i = 1; i < rows; i++) a[i][0] += a[i - 1][0];
        for(int i = 1; i < rows; i++){
            for(int j = 1; j < cols; j++)
                a[i][j] += Math.max(a[i - 1][j], a[i][j - 1]);
        }
        return a[rows - 1][cols - 1];
    }
}

发表于 2021-07-13 10:31:41 回复(0)
int maxPathSum(int** a, int aRowLen, int* aColLen ) {
    // write code here
    for(int i=1;i<*aColLen;i++)
        a[0][i]=a[0][i]+a[0][i-1];
    
    for(int j=1;j<aRowLen;j++)
        a[j][0]=a[j][0]+a[j-1][0];
    
        for(int i=1;i<aRowLen;i++)
        for(int j=1;j<*aColLen;j++)
    {
        if(a[i-1][j]>a[i][j-1])
            a[i][j]=a[i][j]+a[i-1][j];
        else
            a[i][j]=a[i][j]+a[i][j-1];
    }
    return a[aRowLen-1][*aColLen-1];
}
发表于 2021-08-31 22:22:49 回复(0)

基础dp,注意使用原数组操作降低空间复杂度。

class Solution:
    def maxPathSum(self , a ):
        for i in range(len(a)):
            for j in range(len(a[0])):
                if i > 0 and j > 0: a[i][j] += max(a[i-1][j],a[i][j-1])
                elif i > 0: a[i][j] += a[i-1][j]
                elif j > 0: a[i][j] += a[i][j-1]
        return a[-1][-1]
发表于 2022-09-08 14:33:55 回复(0)
import java.util.Random;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        String[] s=scanner.nextLine().split(" ");
        int n=Integer.parseInt(s[0]),m=Integer.parseInt(s[1]);
        int[][] a=new int[n][m];
        Random random=new Random(1);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                a[i][j]= random.nextInt(10);
            }
        }
        int[][] dp=new int[n][m];
        dp[0][0]=a[0][0];
        for (int i = 1; i < m; i++) {
            dp[0][i]=dp[0][i-1]+a[0][i];
        }
        for (int i = 1; i < n; i++) {
            dp[i][0]=dp[i-1][0]+a[i][0];
        }
        for (int i = 1; i < n; i++) {
            for (int j = 1; j < m; j++) {
                dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1])+a[i][j];
            }
        }

        System.out.println(dp[n-1][m-1]);

    }
}

发表于 2021-10-01 00:15:49 回复(0)
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param a int整型vector<vector<>> 
     * @return int整型
     */
    int maxPathSum(vector<vector<int> >& a) {
        // write code here
        int n = a.size();
        int m = a[0].size();
        //dp[i][j]表示走到第[i,j]个格子时的最大萝卜数
        vector<vector<int>> dp(n+1, vector<int>(m+1, 0));
        for(int i = 1; i <= n; ++i){
            for(int j = 1; j <= m; ++j){
                dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + a[i-1][j-1];//上面和左边格子取大者
            }
        }
        return dp[n][m];
    }
};

发表于 2021-07-17 15:31:18 回复(0)
classSolution:
    defmaxPathSum(self, a ):
        m,n =len(a),len(a[0])
        fori inrange(1,n):
            a[0][i] +=a[0][i-1]
        fori inrange(1,m):
            a[i][0] +=a[i-1][0]
        fori inrange(1,m):
            forj inrange(1,n):
                a[i][j] +=max(a[i-1][j],a[i][j-1])
        returna[-1][-1]
发表于 2021-07-06 15:21:50 回复(0)
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param a int整型vector<vector<>> 
     * @return int整型
     */
    int maxPathSum(vector<vector<int> >& a) {
        // write code here
        int row = a.size();
        int col = a[0].size();
        int dp[row][col];
        dp[0][0] = a[0][0];
        for(int i = 1; i < col; i++)
        {
            dp[0][i] = dp[0][i-1] + a[0][i];
        }
        for(int j = 1; j < row; j++)
        {
            dp[j][0] = dp[j-1][0] + a[j][0];
        }
        for(int p = 1; p < row; p++)
        {
            for(int q = 1; q < col; q++)
            {
                dp[p][q] = max(dp[p-1][q], dp[p][q-1]) + a[p][q];
            }
        }
        return dp[row-1][col-1];
    }
};
发表于 2021-07-04 15:20:44 回复(0)