C++ spoj-dp-lsort方法

C++ spoj-dp-lsort方法,c++,algorithm,dynamic-programming,recurrence,C++,Algorithm,Dynamic Programming,Recurrence,这是spoj的一个问题 它说 您将得到一个由n个数字组成的排列,这些数字介于1到n之间,并且没有重复。 任务是按升序对排列进行排序。还有另一个数组Q,我们在其中插入给定排列P中的元素 您必须执行N个步骤来对p进行排序。在第i步中,p有N-i+1个剩余元素,Q有i-1个元素,您必须选择p的一些第x个元素(从N-i+1个可用元素中),并将其放在Q的左侧或右侧。此步骤的成本等于x*i。总成本是各个步骤的成本之和。在N步之后,Q必须是一个升序。你的任务是最小化总成本 输入 输入文件的第一行是T(T≤ 1

这是spoj的一个问题 它说

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

您必须执行N个步骤来对p进行排序。在第i步中,p有N-i+1个剩余元素,Q有i-1个元素,您必须选择p的一些第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
  }
}

对于(l=1;l您可以尝试重新思考您的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
,整个计算可以在O(N^2 log N)中执行,使用自下而上的DP和数据结构在每个状态下计算
x

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