c++ - 给奶牛的款待——自下而上的动态规划

标签 c++ c arrays algorithm dynamic-programming

完整的问题陈述是 here 。假设我们有一个已知值的双端队列。每一轮,我们都可以从一端或另一端取出一个值,并且仍在队列中的值增加为 value*turns 。目标是找到最大可能的总值(value)。

我的first approach是使用简单的自上而下的 DP 和内存。让i , j表示值数组 A[] 的“子数组”的起始、结束索引.

                A[i]*age if i == j
f(i,j,age) =
                max(f(i+1,j,age+1) + A[i]*age , f(i,j-1,age+1) + A[j]*age)

然而,事实证明这种方法太慢了,因为存在多余的堆栈调用。自下而上的迭代应该更快。

m[i][j]A[] 的“子数组”的最大可达值带有开始/结束索引 i , j 。因为i <= j ,我们只关心下三角部分。

可以使用 m[i][j] = max(m[i-1][j] + A[i]*age, m[i][j-1] + A[j]*age) 迭代构建该矩阵,其中age对角线上最大(大小为 A[] 并线性减小为 A.size()-(i-j)

我的尝试implementationbus error 会面.

所描述的算法正确吗?总线错误的原因是什么?

这是代码中唯一可能发生总线错误的部分:

for(T j = 0; j < num_of_treats; j++) {
    max_profit[j][j] = treats[j]*num_of_treats;
    for(T i = j+1; i < num_of_treats; i++)
        max_profit[i][j] = max( max_profit[i-1][j] + treats[i]*(num_of_treats-i+j),
                                max_profit[i][j-1] + treats[j]*(num_of_treats-i+j));
}

最佳答案

for(T j = 0; j < num_of_treats; j++) {

在此循环内,j显然是数组 max_profit 的有效索引。但您不仅仅使用 j .

关于c++ - 给奶牛的款待——自下而上的动态规划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25612429/

相关文章:

c - 如何优雅地构造在 C 中迭代数组的长参数列表

javascript - 在 AngularJS 中使用 ngCSV 之前操作数组

c# - 使用指针参数 (WCT) 从 C# 调用 C++ 方法

c++ - fatal error LNK1169 : one or more multiply defined symbols found in c++

c - 重新加载共享库时,带有__attribute __(constructor)标记的函数是否再次运行?

c++ - 如何在 Eclipse IDE 上显示语法着色和范围界定?

javascript - 使用 javascript 使用算法解决问题

javascript - 递归循环节点的子节点

c++ - 如何使用 std::get 在元组上赋值?

c++ - Eigen 初始化 bool 数组