思路:dp
其实你也可以用搜索,虽然但是,练dp总是没错的。
这道题状态方程dp[i][j]设为从(i,j)起点开始移动的最大次数。明显知道这里需要倒着推导。
由于在最后一列时,我们并不能向右走,所以最后一列初始化为0.其他的,就直接按照题目要求转移状态就行了。
注意:一开始的时候作者是正着推导的,其含义是到(i,j)的最大次数。这里理解错题意了。为什么这样说?我们不一定会到达最后一列,并且状态方程会断,因为有些点我们可能不能走,就以上这些问题就足够说明不行了,其他的还有大大小小的bug,到最后你还需要把整个dp数组比较最大值,很麻烦。
class Solution {
public:
int maxMoves(vector<vector<int>>& grid) {
int n=grid.size();
vector<vector<int>>dp(n+2,vector<int>(grid[0].size()+2,0));
for(int i=0;i<n;i++){
dp[i][grid[0].size()-1]=0;
}
for(int j=grid[0].size()-2;j>=0;j--){
for(int i=0;i<n;i++){
for(int k=-1;k<=1;k++){
if(i+k<0||i+k>=n)continue;
else{
if(grid[i][j]<grid[i+k][j+1])
dp[i][j]=max(dp[i][j],dp[i+k][j+1]+1);
}
}
}
}
int res=0;
for(int i=0;i<n;i++){
res=max(dp[i][0],res);
}
return res;
}
};