【问题标题】:What is the best approach to dp for question TRT (treat for cows) of spoj?对于 spoj 的问题 TRT(对待奶牛),最好的 dp 方法是什么?
【发布时间】:2019-06-29 09:48:59
【问题描述】:

FJ 购买了 N (1

零食编号为 1..N,并以单个文件顺序存储在两端打开的长盒子中。在任何一天,FJ 都可以从他存放的零食的任一端取回一份零食。 就像精美的葡萄酒和美味的奶酪一样,这些零食会随着年龄的增长而提高,价格也会更高。 款待并不统一:有些更好,具有更高的内在价值。对待 i 的值为 v(i) (1

第一个零食在第 1 天售出,年龄 a=1。之后的每一天,年龄都会增加 1。

输入 第 1 行:单个整数,N

第 2..N+1 行:第 i+1 行包含treat v(i) 的值

输出 FJ通过出售零食可以获得的最大收入

示例 输入: 5

1 3 1 5 2

输出: 43

在这个问题中 dp 的基本方法是什么?我如何处理 dp 矩阵中的年龄...?唯一让我想到的方法是递归方法...我是 DP 的新手,我已经解决了一些基本的 dp 问题,但这超出了我的想法...这是我迄今为止尝试过的

int give(int a[],int x,int y,int age)
{

if(x==y) return age*a[x];

return max(age*a[x]+give(a,x+1,y,age+1),age*a[y]+give(a,x,y-1,age+1));

}

x=起始索引,从 0 初始化,y=last index,n-1,age=1 at first call

【问题讨论】:

  • @sp2danny bro 我以前读过这篇社论,但没有遵循所使用的概念
  • 您有一个问题要解决并开始一个解决方案。你的问题是什么? (您面临什么具体问题?)
  • @JaMiT 我现在不知道该怎么办......我正在考虑创建一个 n*n 的 2d dp 矩阵,并且在我的脑海中有一个逻辑......但是如何我是否在该矩阵中处理​​年龄
  • @satish 这是一个计划。写出您希望矩阵表示的内容,并概述您的逻辑要求(例如前置条件、后置条件和不变量)。然后创建你的矩阵,试试你的逻辑,看看会发生什么。如果实际结果与您的预期结果不符,您可能会在这里提出更好的问题。

标签: c++ dynamic-programming


【解决方案1】:

首先要观察的是,当前状态不取决于我们从哪里获取零食的历史。我们唯一关心的是我们从左边拿了多少次,从右边拿了多少次。

因此,状态只能用 2 个数字进行编码:左偏移量和右偏移量。

f(i,j) 成为我们在当前移动之前仍然可以获得的金额。我们知道我们已经从行中取出了i+j 对象,所以年龄也是i+j

因此,我们只需要检查我们想从哪个位置开始,然后选择更好的位置。好吧,如果我们从左边挑选一个款待,我们获得的金额将是

cost * time + f( i + 1 , j ) = cost * (i + j) + f( i + 1 , j )

如果我们从右边取的金额有一个非常相似的公式

cost_right * (i + j) + f( i , j + 1 )

因此我们可以知道f(i+1,j)f(i,j+1) 计算f(i,j)

这可以使用动态编程来完成,方法是存储一个大小为n*n 的二维数组,如果f(i,j) 未知,则存储-1,或者如果已知,则存储f(x,y) 的值。然后您可以简单地更新上述递归方法以实际存储结果并返回已知的解决方案。如果我们看一下您的代码示例,我们可以修改它以及时运行。

    int give(int a[],int x,int y,int age)
    {
        if(dp[x][y]!=-1) return dp[x][y];
        if(x==y) return age*a[x];

        int answer=max(age*a[x]+give(a,x+1,y,age+1),age*a[y]+give(a,x,y-1,age+1));

        dp[x][y]=answer;
        return answer;
    }

这只是一个 sn-p,因为您需要修复边界条件并制作实际的全局 dp 数组,但我希望这足以开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2015-07-31
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    相关资源
    最近更新 更多