jump game

这道题目,让我第一反应是跳兽问题,但是具体忘记了 ,解法也忘了。
看起来就是可以映射到矩阵链的,于是构建递推方程,中间的k似乎不能等于两个端点,然后单独处理这种可能一次跳过的,循环记住第一重是长度,保证子问题已解出。

小心翼翼码完,发现二维全局变量好像超了空间,除了runtime,于是改heap ,超了空间,后来有人说有greedy算法,我目前还没想到。。。。

class Solution {
public:
    int MAX=1000000;
    bool canJump(int A[], int n) {
        if(n==0) return 0;
        int **dp=new int*[n];
        for(int i=0;i<n;i++)
            dp[i]=new int[n];

        for(int i=0;i<=n-1;i++)
            dp[i][i]=0;
        for(int l=2;l<=n;l++)//chain length
        {
            for(int s=0;s<=n-1;s++)//start indx
            {
                int e=s+l-1;
                if(e>n-1)
                    break;
                if(A[s]>=l-1)//min 1
                    dp[s][e]=1;
                else
                {
                    int min=MAX;
                    for(int k=s+1;k<=e-1;k++)
                    {
                        if(min>dp[s][k]+dp[k][e])
                            min=dp[s][k]+dp[k][e];
                    }
                    dp[s][e]=min;
                }
            }
        }

        int minjump=dp[0][n-1];


        for(int i=0;i<n;i++)
            delete[] dp[i];
        delete[] dp;

        if(minjump!=MAX) return true;
        else return false;
        //return minjump;
    }
};

后来还是看了题解,贪心算法没有想到,也不知道怎么和贪心的模板题联系,例如活动安排,普通背包基于排序的,Dijstra Huffman基于选择最小(大),这里就是用last记录 ret次可以跳到的最大,然后cur则是多跳
一步,ret+1的最远,如果当前遍历的i>last, 说明我已经超过当前最远了,那么需要看是否加一步能跳的更远,如果不能就不可能再往后跳了,否则就更新last为多跳一步,ret也++,但是 感觉还是不很make sense
暂时这么理解了。

int jumpgame(int *a, int n)
{
    int last=0,cur=0,ret=0;
    for(int i=0;i<n;i++)
    {
        if(i>last)
        {
            if(cur==last)
                return -1;
            last=cur;
            ret++;
        }
        if(cur<i+a[i])
            cur=i+a[i];
    }
    return ret;
}

Posted by richard爱闹 - 7月 25 2014
如需转载,请注明: 本文来自 Richard