我试图从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正是在时间复杂度方面也是如此,有时候,在少数情况下,更好。但是,这似乎违反了法律......
我觉得我没有正确地记住解决方案,或者,我正在以一种有效的方式定义子问题。有人可以帮助我吗?