t个数据
n个权值
1->n
可以入栈调整顺序
花费 第k个出来 w[i]*(k-1);
求花费最少
#include<stdio.h>
#include<string.h>
#include<algorithm> using namespace std;
#define MAXN 110
#define inf 100000000 int z[MAXN],sum[MAXN];
int dp[MAXN][MAXN]; int main()
{
int t,ca;
scanf("%d",&t);
ca=; while(t--)
{
int n,i,l,j,k;
scanf("%d",&n);
for(i=;i<=n;i++)
{
scanf("%d",&z[i]);
sum[i]=sum[i-]+z[i];
}
memset(dp,,sizeof(dp));
for(i=;i<=n;i++)
for(j=i+;j<=n;j++)
dp[i][j]=inf; for(l=;l<=n;l++)
{
for(i=;i<=n-l+;i++)
{
j=i+l-;
for(k=;k<=l;k++) 列举第k个出场 i+1 i+k-1 前面出来 i+k j 后面出来 要加上前面k个出来的花费 这个人出来花费
{
dp[i][j]=min(dp[i][j],dp[i+][i+k-]+dp[i+k][j]+k*(sum[j]-sum[i+k-])+z[i]*(k-));
}
}
}
printf("Case #%d: %d\n",ca++,dp[][n]);
}
return ;
}