查找创建特定序列所需的最小对象数

时间:2014-03-09 21:36:38

标签: algorithm dynamic-programming greedy

你有N个字段(1< = N< = 100),它们都排成一条长线 直路。每个字段可能包含几种类型的音乐播放器;你拥有 B类音乐播放器(1< = B< = 20)和类型i的音乐播放器给出音量 V(i)(1< = V(i)< = 100)。而且,还有一阵强风吹倒了 道路,在一个方向上传播音乐的声音:如果音量 某些领域的音乐是X,然后在下一个领域,这将贡献X-1 总音乐音量(以及之后的音乐中的X-2等)。但是,一旦达到0而贡献的音量将不会变为负数。

考虑到您在每个字段中记录的音乐量,请计算 您可能拥有的最少音乐播放器数量。

您在任何字段中记录的音量最多为100,000。

输入格式:

  • 第1行:整数N和B.

  • 第2..1 + B行:第i + 1行包含整数V(i)。

  • 第2行+ B..1 + B + N:第1行+ B + i包含所有mooing的总音量     在现场i。

示例输入:

5 2 五 7 0 17 16 20 19

输入详细信息: 您拥有5个字段,其中的卷记录为0,17,16,20,19。有两种类型 音乐播放器;第一个的体积为5,另一个的体积为7。

输出格式:

  • 第1行:您拥有的音乐播放器的最小数量,如果没有,则为-1     音乐播放器的配置与输入一致。

示例输出:

4

输出详情:

在场2中有2个#1类型的音乐播放器和1个#2类型的音乐播放器,并且有 另一个在第4场中排名第一的音乐播放器,共有4个音乐播放器。这是在现场记录这些卷所需的最低值。

我的想法: 我知道这是一个动态编程问题。我当时认为dp [i]代表了第n场的音乐播放器,但我似乎无法弄清楚这一点。

请你帮我解释一个不错的dp解决方案,如果可能的话,提供一些伪代码,这样我就可以更好地编写dp。

1 个答案:

答案 0 :(得分:0)

不是最佳解决方案,而是使用动态编程解决时间复杂度O(B * MAX(recorded volume) + N)问题的解决方案

这是一个两步解决方案。 在步骤1中,找到生成特定音量所需的最小音乐播放器,从1到MAX(记录音量)(可能有些音量不可用)

然后在第2步中,从第一个字段到最后一个字段,计算每个字段需要产生的音量,然后使用步骤1中的结果来了解该字段中有多少音乐播放器需要。

以输入/输出为例。 在步骤1中,您可以获得player_required [5] = 1,player_required [7] = 1,player_required [10] = 2,player_required [12] = 2,player_required [14] = 2,player_required [15] = 3,player_required [17] = 3,player_required [19] = 3,....意味着你需要一个玩家产生5或7的音量,但如果你想产生15或17的音量,你需要3个玩家。

在步骤2中,首先转到第1场,音量为0,不需要任何玩家。在字段2中,音量为17,因此在此字段中您需要3个玩家。在字段3中,字段2的音量为16(17-1),它与字段3中的音量匹配。因此,字段3中不需要播放器。然后在字段4中,字段3的音量为15但音量现场20岁。所以你知道你应该在第4场中产生5的音量。根据步骤1中的计算,你需要1个玩家。并且第5场不需要任何参与者。总而言之,你需要4个音乐播放器(第2场中有3个,第4场中有1个)

如果在步骤2中无法在任何字段中生成所需的音量,则应输出-1,因为没有与输入一致的音乐播放器配置。

抱歉英语不好,希望有所帮助。