我发现了这个有趣的动态编程问题,需要重新排序整数序列才能最大化输出。
史蒂夫有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!)时间复杂度。这个问题可以更有效地解决吗?
谢谢!