【问题标题】:spoj dp lsort approachspoj dp lsort 方法
【发布时间】:2014-09-04 14:01:17
【问题描述】:

http://www.spoj.com/problems/LSORT/是spoj的问题 它指出

给定 n 个介于 1 到 n 之间且没有重复的数字的排列。 任务是按升序对该排列进行排序。还有另一个数组 Q,我们从给定的排列 P 中插入元素。

你必须执行 N 步来对 P 进行排序。在第 i 步中,P 有 N-i+1 个剩余元素,Q 有 i-1 个元素,你必须选择一些第 x 个元素(从 N -i+1 个可用元素)并将其放在 Q 的左侧或右侧。这一步的成本等于 x * i。总成本是各个步骤成本的总和。经过 N 步后,Q 必须是一个升序。你的任务是最小化总成本。

输入

输入文件的第一行是 T (T ≤ 10),测试用例的数量。然后是 T 测试用例的描述。每个测试用例的描述由两行组成。第一行包含一个整数 N (1 ≤ N ≤ 1000)。第二行包含来自集合 {1, 2, .., N} 的 N 个不同整数,即 N 元素置换 P。

输出

对于每个测试用例,您的程序应该写一行,包含一个整数 - 排序的最小总成本。

现在我已经弄清楚了 dp 我的递归关系表明,为了从具有 i 到 j 的值的元素中获得最佳值,我必须在前面插入 $i$ 或在后面插入 $j$。

在前面插入 i 的成本 = dp[i+1][j]+在前面添加元素 i 的成本

在后面插入 j 的成本 = dp[i][j-1] +在后面添加元素 j 的成本

而且我必须至少选择这些。答案是 dp[1][n]

for(l=1;l<=n;l++) //length of current permutation Q
{
  for(i=1;i<=n-l+1;i++) //starting value of permutation Q
  {
   j=i+l-1;  //ending value of permutation Q
   dp[i][j]=min(dp[i+1][j]+l*xi,dp[i][j-1]+l*xj);//chosing wether to insert i at start or j at end
  }
}

这里 xi=元素 i 从排列 P 开始的索引。

and yi=元素 j 从排列 P 开始的索引。

ans 将是 dp[1][n]

但我无法弄清楚 xi 和 xj 请帮忙

【问题讨论】:

    标签: c++ algorithm dynamic-programming recurrence


    【解决方案1】:

    您可以尝试重新考虑您的 DP 状态。

    对我来说,我会使用 dp[startQ][endQ] 其中 dp[startQ][endQ] 表示我在数组 Q 中“排序”值 startQ 到 endQ 所产生的成本。

    如果您知道数组 Q 中的内容(整数 startQ 到 endQ 包括在内),则只需删除/忽略 startQ 和 endQ 中的所有整数,即可轻松重建 P 数组。

    对于每个状态,dp[startQ][endQ],因为一个只能添加到Q的前面或后面, dp[startQ][endQ] 只能是:

    dp[startQ][endQ-1] + 添加 endQ 的成本 dp[startQ-1][endQ] + 添加 startQ 的成本

    基本情况是 dp[i][i] = 0;

    这些状态可以计算,答案可以在 dp[1]][n]; (假设它是一个索引)。 但是,如果要以自上而下的方式对其进行编码,我还没有想到一种有效的方法来计算 x,因为整个计算可以使用自下而上的 DP 在 O(N^2 log N) 中执行用于在每个状态下计算 x 的数据结构。

    我会将最后的细节留给您编写代码 :) 但如果需要,我可以提供更多帮助。

    【讨论】:

      猜你喜欢
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 2011-11-22
      • 1970-01-01
      • 2018-06-11
      • 2015-06-20
      • 1970-01-01
      相关资源
      最近更新 更多