青蛙过河
一开始就没啥想法,没有头绪
读题是明显的跳跃有递推关系,但是不仅仅是由前一个两个状态推
动态规划,假设跳了k个位置到i,那么上一步是从j = i - k跳过来的,回退,是跳了k-1/k/k+1步到的j
所以dp[i][k] = dp[j][k-1]||dp[j][k]||dp[k+1]
如何确定最初的true值? 注意到第一次只能跳一步,那么上一步相当于0步 dp[0][0] = true
每次跳跃步长最多+1,n块石子,最多跳n-1次,最长n-1步
class Solution {
public:
bool canCross(vector<int>& stones) {
int n = stones.size();
vector<vector<bool>> dp(n+1,vector<bool>(n+1,false));
dp[0][0] = true;
for(int i=1;i<n;++i){
for(int j=0;j<i;++j){
int k = stones[i] - stones[j];
if ( k >= n)//步数最大为n-1
continue;
dp[i][k] = dp[j][k-1] || dp[j][k] || dp[j][k+1];
}
}
for(int i=0;i<n;++i){
if (dp[n-1][i] == true)
return true;
}
return false;
}
};
时空复杂度都是n^2