思路:dp题,f[i][j]表示从i到j的最小值,先把f数组初始化为很大,求最小值,把f[i][j]分为i到k,和k到j两段区间,分解成小部分,得到动态转移公式
f[i][j]=min(f[i][j],f[i][k]+a[i]*a[k]*a[j]+f[k][j]);
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int INF=100000;
int a[105];
int f[105][105];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
f[i][j]=INF;
for(int i=1;i<=n;i++)
f[i][i-1]=f[i][i]=f[i][i+1]=0;
for(int i=2;i<=n-1;i++)
f[i-1][i+1]=a[i-1]*a[i]*a[i+1];
for(int i=n-2;i>0;i--)
{
for(int j=i+2;j<=n;j++)
{
for(int k=i+1;k<j;k++)
{
if(f[i][j]>f[i][k]+a[i]*a[k]*a[j]+f[k][j])
f[i][j]=f[i][k]+a[i]*a[k]*a[j]+f[k][j];
}
}
}
printf("%d\n",f[1][n]);
return 0;
}