首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >蓝莓(SPOJ) -超过动态规划时限

蓝莓(SPOJ) -超过动态规划时限
EN

Stack Overflow用户
提问于 2015-01-27 13:16:00
回答 1查看 613关注 0票数 0

我在斯派杰上解一个问题。问题有一个简单的递归解决方案。

问题:给定一个大小为n的数字数组,选择一组数字,使集合中没有两个元素是连续的,子集元素的和将尽可能接近k,但不应超过它。

我的递归方法

我使用了一种类似于背包的方法,将问题划分为包含当前元素,而其他元素则忽略它。

代码语言:javascript
复制
  function solve_recursively(n, current, k)
     if n < 0
        return current
     if n == 0
        if current + a[n] <= k
           return current + a[n]
        else
           return current
     if current + a[n] > k
        return recurse(n-1, current, k)
     else
        return max(recurse(n-1, current, k), recurse(n-2, current+a[n], k))

后来,由于它在本质上是指数的,我使用map (在C++中)进行回忆录以降低复杂性。

我的源代码:

代码语言:javascript
复制
struct k{
  int n; 
  int curr;
};

bool operator < (const struct k& lhs, const struct k& rhs){
  if(lhs.n != rhs.n)
    return lhs.n < rhs.n;
  return lhs.curr < rhs.curr;
};

int a[1001];
map<struct k,int> dp;

int recurse(int n, int k, int curr){
  if(n < 0)
    return curr;
  struct k key = {n, curr};
  if(n == 0)
    return curr + a[0] <= k ? curr + a[0] : curr;
  else if(dp.count(key))
    return dp[key];
  else if(curr + a[n] > k){
    dp[key] = recurse(n-1, k, curr);
    return dp[key];
  }
  else{
    dp[key] = max(recurse(n-1, k, curr), recurse(n-2, k, curr+a[n]));
    return dp[key];
  }
}

int main(){
  int t,n,k;
  scanint(t);
  while(t--){
    scanint(n);
    scanint(k);
    for(int i = 0; i<n; ++i)
      scanint(a[i]);
    dp.clear();
    printf("Scenario #%d: %d\n",j, recurse(n-1, k, 0));
  }
  return 0;
}

我检查了给定的测试用例。它清除了他们。但我在屈服时得到了错误的答案。

编辑:之前我的输出格式是错误的,所以我得到了错误的答案。但是,现在它显示的时限超过了。我认为自下而上的方法是有帮助的,但我在制定一种方法上有问题.我正在接近它作为自下而上的背包,但有一些困难,在确切的配方。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-27 13:36:20

据我所知,你几乎有办法了。如果递归关系是正确的,但效率太低,则只需将递归更改为迭代。显然,您已经有了表示状态及其各自值的数组dp。基本上,您应该能够为nkcurr解决使用三个嵌套循环填充nkcurr的问题,这三个循环将分别增加,以确保已经计算了所需的dp的每个值。然后将对recurse的递归调用替换为对dp的访问。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28171454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档