区间dp
dp[i][j]表示i,j区间内最小乘积和。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int dp[105][105],a[105];
int dfs(int le,int ri)
{
int i;
// printf("*%d %d %d\n",le,ri,dp[le][ri]);
if(dp[le][ri]!=-1)
return dp[le][ri];
if(le==ri-1)
{
dp[le][ri]=0;
return 0;
}
dp[le][ri]=dfs(le,le+1)+dfs(le+1,ri)+a[le]*a[ri]*a[le+1];
for(i=le+1;i<ri;i++)
if(dfs(le,i)+dfs(i,ri)+a[le]*a[ri]*a[i]<dp[le][ri])
{
dp[le][ri]=dp[le][i]+dp[i][ri]+a[le]*a[ri]*a[i];
}
// printf("#%d %d %d\n",le,ri,dp[le][ri]);
return dp[le][ri];
}
int main()
{
int n,i,j,k,l;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(dp,-1,sizeof(dp));
dfs(1,n);
printf("%d\n",dp[1][n]);
// for(i=1;i<=n;i++)
// for(j=1;j<=n;j++)
// printf("%d %d %d\n",i,j,dp[i][j]);
}
return 0;
}