题意
给一个不增序列A,对于序列B,
Bi=∑nj=iAj
,定义
f(i,j)=⎧⎩⎨⎪⎪⎪⎪0min(f(i−1,j+1),f(i,⌈j2⌉)+Bi)1011037(i,j)=(1,1)i,j∈[1,n], (i,j)≠(1,1)otherwise
,问
f(n,1)
思路
这个答案就是哈夫曼的WPL
代码
#include <cstdio>
#include <queue>
using namespace std;
priority_queue<long long,vector<long long>,greater<long long> > pq;
int main()
{
long long T,n,a,ans,p;
scanf("%I64d",&T);
while(T--)
{
scanf("%I64d",&n);
for(long long i=0;i<n;i++)
{
scanf("%I64d",&a);
pq.push(a);
}
ans=0;
while(pq.size()>1)
{
p=pq.top();
pq.pop();
p+=pq.top();
pq.pop();
ans+=p;
pq.push(p);
}
printf("%I64d\n",ans);
while(!pq.empty())
pq.pop();
}
return 0;
}