【发布时间】: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