f(i,j)=min(f(i-1,k)+f(k+1,j)+ai-1*ak*aj)
k表示被抽取的数
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<vector> 5 #include<queue> 6 #include<cmath> 7 #include<cstring> 8 using namespace std; 9 const int maxn=1e6+5; 10 const int INF=1e9+7; 11 int n,dp[105][105],a[105]; 12 template <class t>void red(t &x) 13 { 14 x=0; 15 int w=1; 16 char ch=getchar(); 17 while(ch<'0'||ch>'9') 18 { 19 if(ch=='-') 20 w=-1; 21 ch=getchar(); 22 } 23 while(ch>='0'&&ch<='9') 24 { 25 x=(x<<3)+(x<<1)+ch-'0'; 26 ch=getchar(); 27 } 28 x*=w; 29 } 30 void input() 31 { 32 freopen("input.txt","r",stdin); 33 } 34 void read() 35 { 36 red(n); 37 memset(dp,0x3f,sizeof(dp)); 38 for(int i=1;i<=n;++i) 39 { 40 red(a[i]); 41 dp[i][i]=0; 42 } 43 } 44 void work() 45 { 46 for(int i=1;i<=n;++i) 47 for(int j=2;j+i<=n+1;++j) 48 { 49 int e=i+j-1; 50 for(int k=j;k<e;++k) 51 dp[j][e]=min(dp[j][k]+dp[k+1][e]+a[k]*a[j-1]*a[e],dp[j][e]); 52 } 53 printf("%d",dp[2][n]); 54 } 55 int main() 56 { 57 //input(); 58 read(); 59 work(); 60 return 0; 61 }