【问题标题】:Hard DP prob pseudocode algorithmHard DP prob伪代码算法
【发布时间】:2019-01-02 17:57:48
【问题描述】:

所以这就是问题:

有一个演员正在举行粉丝见面会,他试图向排队的粉丝免费拥抱。他从 0 号位开始,左右两边都有粉丝。他们的位置由 neg 和 pos 数字表示,如 -3、5 等。他的粉丝从拥抱中获得的“效用”(经济学)从某个数字开始,比如 10,然后每走 1 距离就会减少 1。演员想要找到一种算法来最大化他的粉丝获得的效用。

例如,位置 2、4、6 的粉丝初始效用为 10 的最大效用是 8 + 6 + 4。

粉丝数 N 最大为 100,初始效用 M 最大为 10000(不能为负数)。粉丝的位置在-10000到10000之间。

请根据初始实用程序、粉丝数量和粉丝位置帮助用伪代码解决这个 q。

我想不出办法来解决它。

【问题讨论】:

    标签: algorithm data-structures dynamic-programming


    【解决方案1】:

    dp[r][l][b][i] = 你可以通过访问 r 作为最右边的粉丝,l 作为最左边的粉丝,b 是一个布尔值,表示你是否在最右边的粉丝的位置或左, i 是剩余的效用。可能的状态数量为 100 * 100 * 2 * 10000 = 200000000,应该可以在一秒钟内解决。

    伪代码:将粉丝分成 2 个:0 的。

    solve(left, right, atRight, utility):
        if left < 0 or right > totalFans or utility <= 0:
            return 0
        if dp[left][right][atRight][utility] != None:
            return dp[left][right][atRight][utility]        
    
        if atRight == true:
            dp[left][right][atRight][utility] = max(solve(left, right + 1, true, utility - distance(right, right + 1)), solve(left + 1, right, false, utility - distance(right, left + 1))) + utility
        else:
            dp[left][right][atRight][utility] = max(solve(left + 1, right, false, utility - distance(left, left + 1)), solve(left, right + 1, true, utility - distance(right + 1, left))) + utility
    
    return dp[left][right][atRight][utility]
    
    
    
    answer = max(solve(0, 1, true, initialUtility - distance(0, firstFan at dist > 0)), solve(1, 0, false, initialUtility - distance(0, firstFan at dist < 0)))
    

    你基本上尝试了所有的可能性,你的状态是你所在的位置,你已经拥抱的最右边的粉丝,你已经拥抱的最左边的粉丝和剩下的效用。如果最左边的粉丝是 10,这意味着你已经拥抱了最接近 0 的粉丝,即在 pos

    【讨论】:

    • 您能多解释一下吗?我还是不明白你的想法?
    猜你喜欢
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2021-12-21
    • 2021-03-23
    • 2013-04-07
    • 2010-12-14
    相关资源
    最近更新 更多