spoj dp lsort方法

时间:2014-09-04 14:01:17

标签: c++ algorithm dynamic-programming recurrence

http://www.spoj.com/problems/LSORT/这是一个关于spoj的问题 它说明了

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

你必须实现N个步骤来排序P.在第i步中,P有N-i + 1个剩余元素,Q有i-1个元素,你必须选择一些第x个元素(来自N P的-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 =从排列P开始的元素 i 的索引。

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

ans将是dp [1] [n]

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

1 个答案:

答案 0 :(得分:0)

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

对我来说,我会使用dp [startQ] [endQ],其中dp [startQ] [endQ]表示我在数组Q中对startQ to 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进行编码,我还没有想过有效的方法来计算x,因为整个计算可以使用自下而上的方式在O(N ^ 2 log N)中执行DP具有用于在每个州计算{{1}}的数据结构。

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