基于动态编程的曲折拼图

时间:2015-08-15 15:32:50

标签: algorithm dynamic-programming

我发现了这个有趣的动态编程问题,需要重新排序整数序列才能最大化输出。

史蒂夫有 N 酒瓶。 ith 瓶的酒量由 A[i] 给出。现在他想从每个瓶子里喝一杯饮料,这样可以最大限度地消除宿醉。 总宿醉计算如下(假设'酒精数量'数组使用基于1的索引):

int hangover=0 ;
for( int i=2 ; i<=N ; i++ ){
    hangover += i * abs(A[i] - A[i-1]) ;
}

所以,显然他从每个瓶子里喝的顺序会改变Total宿醉。他可以按任何顺序饮用酒,但每瓶不超过一杯。此外,一旦他开始喝酒,他就会在喝完酒之前喝完。

史蒂夫对他应该饮酒的顺序感到困惑,以致宿醉最大化。如果他可以按任何顺序喝酒,帮助他找到他可以拥有的最大宿醉。

输入格式: 第一行包含多个测试用例T。每个测试用例的第一行包含N,表示水果的数量。下一行包含N个空格分隔的整数,表示每个水果的甜度。

2
7
83 133 410 637 665 744 986
4
1 5 9 11

我尽我所能,但我无法实现O(n ^ 2)解决方案。通过简单地计算所有排列的总宿醉具有O(n!)时间复杂度。这个问题可以更有效地解决吗?

谢谢!

0 个答案:

没有答案