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 请帮忙
答案 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}}的数据结构。
我会留下最后的细节供您编写代码:)但如果需要,我可以提供更多帮助。