#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define MAXSIZE 105000
#define sf scanf
#define pf printf
#define __int64 long long
#define INF 0xfffffff
using namespace std;
int dp[205][205],x[205],s[205];
void get_dp(int n)
{
memset(dp,0,sizeof(dp));
for(int i=0;i<=n;i++)
for(int j=i+1;j<=n;j++) dp[i][j]=INF;
for(int l=1;l<=n;l++)
for(int i=1;i<=n-l;i++)
{
int j=i+l;
for(int k=i;k<=j;k++)
{
dp[i][j]=min(dp[i][j],x[i]*(k-i)+dp[i+1][k]+dp[k+1][j]+(s[j]-s[k])*(k-i+1));
//cout<<dp[i][j]<<endl;
}
}
}
int main()
{
freopen("in.txt","r",stdin);
int test=0,t;
sf("%d",&t);
int n;
while(t--)
{
sf("%d",&n);
s[0]=0;
for(int i=1;i<=n;i++)
{
sf("%d",&x[i]);
s[i]=s[i-1]+x[i];
}
get_dp(n);
printf("Case #%d: %d\n",++test,dp[1][n]);
}
}
DFS---类似消方块
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[110][110][110];
int x[120];
int min(int x,int y)
{
if(x<y) return x;
return y;
}
int DFS(int s,int e,int k)
{
if(s==e) return x[s]*k;
if(s>e) return 0;
if(dp[s][e][k]!=0xfffffff) return dp[s][e][k];
dp[s][e][k]=x[s]*k+DFS(s+1,e,k+1);
for(int i=s+1;i<=e;i++)
{
int l=DFS(s+1,i,k);
int r=DFS(i+1,e,k+i-s+1);
int m=x[s]*(k+i-s);
dp[s][e][k]=min(dp[s][e][k],l+r+m);
}
return dp[s][e][k];
}
int main()
{
int t,test=0;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x[i]);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=0;k<=n;k++)
{
dp[i][j][k]=0xfffffff;
}
DFS(1,n,0);
int minnum=0xfffffff;
printf("Case #%d: %d\n",++test,dp[1][n][0]);
}
}