状态方程 :dp [i] [j] 是区间 [i , j] 已经全部取完,只剩下 i j所剩的最小代价。
状态转移 :dp [i][j] = min (dp [i][j], dp[i][k] + dp[k] [j] + a[i]*a[k]*a[j])
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int INF=0x3f3f3f3f;
int dp[105][105];
int a[105];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
memset(dp,0,sizeof(dp));
for(int len=2;len<n;len++)
for(int l=1;l+len-1<=n;l++)
{
int r=l+len-1;
dp[l][r]=INF;
for(int k=l;k<r;k++)
dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]+a[l-1]*a[k]*a[r]);
}
printf("%d\n",dp[2][n]);
}
}