这道题和leetcode上的一个机器人走路路径的问题相似,都是用动态规划来解决。
方法一:
维护一个二维数组,每一个位置的数字表示到达这个位置的最大值。
代码:
int [][] d=new int[r][c];
for(int i=0;i<c;i++)
{
if(i==0) d[0][i]=grid[0][i];
else
{d[0][i]=d[0][i-1]+grid[0][i];}
}
for(int i=0;i<r;i++)
{
if(i==0) d[i][0]=grid[i][0];
else
{
d[i][0]=d[i-1][0]+grid[i][0];
}
}
for(int i=1;i<r;i++)
{
for(int j=1;j<c;j++)
{
d[i][j]=Math.max((d[i][j-1]+grid[i][j]),(d[i-1][j]+grid[i][j]));
}
}
return d[r-1][c-1];
方法二:
思路相同,但是不维护一个二维数组,用一个一维的数组就好。
代码:
int r=grid.length;
int c=grid[0].length;
int[] cur=new int[c];
// int pre=int[c];
for(int i=0;i<c;i++)
{
if(i==0) cur[i]=grid[0][i];
else
{cur[i]=cur[i-1]+grid[0][i];}
}
for(int i=1;i<r;i++)
{
for(int j=0;j<c;j++)
{
if(j==0) cur[j]=cur[j]+grid[i][j];
else
{
cur[j]=Math.max((cur[j-1]+grid[i][j]),(cur[j]+grid[i][j]));
}
}
}
return cur[c-1];