C语言解礼物的最大值

  1. 解题思路:一个经典的动态规划问题,求方格路径的最大值,例如求dp[i][j],表示位置i,j的最大值,由于路径只能向右或者向下,也就是i,j位置只能来源于(i-1,j)或者是(i,j-1),求其最大值即可。dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a[i][j]。
  2. 初始值:初始化第一行以及第一列,路径是确定的。
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param grid int整型二维数组 
 * @param gridRowLen int grid数组行数
 * @param gridColLen int* grid数组列数
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int maxnum(int a,int b){
    return a>b?a:b;
}
int maxValue(int** grid, int gridRowLen, int* gridColLen ) {
    // write code here
    //经典动态规划问题 dp[i][j]表示第i行 j列 最大的礼物
    //dp[i][j]=max(dp[i-1][j],dp[i][j-1])+arr[i][j]
    if(grid==NULL)
        return 0;
    int dp[200][200];
    dp[0][0]=grid[0][0];
    for(int i=1;i<gridRowLen;i++)
        dp[i][0]=dp[i-1][0]+grid[i][0];
    for(int i=1;i<*gridColLen;i++)
        dp[0][i]=dp[0][i-1]+grid[0][i];
    for(int i=1;i<gridRowLen;i++){
        for(int j=1;j<*gridColLen;j++){
            dp[i][j]=maxnum(dp[i-1][j],dp[i][j-1])+grid[i][j];
        }
    }
    return dp[gridRowLen-1][*gridColLen-1];
}