又弱弱地发一个博客,写完就睡觉,本题是一个动态规划的题目,转移方程为 d[i][j]=min(d[i][k]+d[k][j]+a[i]*a[k]*a[j]); i<k<j,k表示i和j之间最后一个被拿走的数
#include <iostream>
#include <cstdio>
using namespace std;
int n;
const int maxn=100;
const int inf=(1<<31)-1;//最大有符号int型整数
int a[maxn],d[maxn][maxn];
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
d[i][j]=inf;
for(int i=0;i<=n-3;i++)
d[i][i+2]=a[i]*a[i+1]*a[i+2];//对三个数的进行预处理
for(int i=0;i<=n-2;i++)
d[i][i+1]=0;
for(int s=3;s<n;s++)
for(int i=0,j=i+s;j<=n-1;i++,j++)
for(int k=i+1;k<j;k++)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]+a[i]*a[k]*a[j]);
printf("%d\n",d[0][n-1]);
return 0;
}