寒假已经过去那么几天了,加油了,这个寒假很关键很关键!
/*
dp
不错的一道题。状态方程dp[i][j]=min{dp[i][k]+dp[k][j]+num[i]*num[k]*num[j]} (i<k<j)
dp[i][j]表示第i个元素到第j个元素按照游戏规则所得的最优解。
Process:
1.一开始一直想成 dp[i][j]=min{dp[i][k]+dp[k][j]+num[k-1]*num[k]*num[k+1]} (i<k<j)
然后发现上面式子明显就错了,因为这样表示先取出num[k],可是取了k之后他两边的元素明显
会受到影响。。
2.N久之后才转过弯来,应该是num[k]作为最后取的元素,这样就不影响其余元素状态了。
所以很多时候反向考虑问题是很重要的!
*/
#include <iostream>
#include <cstdio>
#include <limits.h>
using namespace std;
int num[110];
int dp[110][110];
int main()
{
int n,i,j,k,mini;
while( cin>>n )
{
for( i=0;i<n;i++ )
cin>>num[i];
for( i=0;i<=n-2;i++ )
dp[i][i+1]=0;
for( j=2;j<=n-1;j++ )
{
for( i=0;i<=n-1-j;i++ )
{
mini=INT_MAX;
for( k=i+1;k<i+j;k++ )
if( mini>dp[i][k]+dp[k][i+j]+num[i]*num[k]*num[i+j] )
mini=dp[i][k]+dp[k][i+j]+num[i]*num[k]*num[i+j];
dp[i][i+j]=mini;
}
}
cout<<dp[0][n-1]<<endl;
}
return 0;
}