每日一题DAY21青蛙过河

青蛙过河
在这里插入图片描述
一开始就没啥想法,没有头绪
读题是明显的跳跃有递推关系,但是不仅仅是由前一个两个状态推
动态规划,假设跳了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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值