如何加速这个DP?

时间:2015-01-22 07:54:42

标签: c++ performance algorithm dynamic-programming memoization

我试图从codechef解决this problem并创建一个利用memoization的自上而下的DP解决方案。以下是此问题的代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;

vector<int> height;
vector<int> memo;

int jump(int i)
{
    if(memo[i] != -1)
        return memo[i];
    else
    {
        int min = 987654321, res;
        for(int j = (i - 1);j >= 0;j--)
        {
            if(!(height[i]-height[j] == 0) && !(height[i]-height[j] & (height[i]-height[j] - 1)))
            {
                res = jump(j) + height[i]-height[j];
                if(res < min)
                    min= res;
            }
        }
        memo[i] = min;
        return min;
    }
}

int main(void)
{
    int n;
    scanf("%d", &n);
    height.resize(n, 0);
    memo.resize(n, -1);
    memo[0] = 0;
    for(int i = 0;i < n;i++)
    {
        scanf("%d", &height[i]);
    }
    int ans = jump(n-1);
    printf("%d\n", ans);
}

问题的时间限制是1秒,我看到一些解决方案做了几乎相同的事情(int bottom up DP)并且通过......但我读到了自下而上的DP和自上而下的DP正是在时间复杂度方面也是如此,有时候,在少数情况下,更好。但是,这似乎违反了法律......

我觉得我没有正确地记住解决方案,或者,我正在以一种有效的方式定义子问题。有人可以帮助我吗?

0 个答案:

没有答案