还是水题。
状态转移方程:dp(i,j)=min{dp(i,k)+dp(k,j)+a[i]a[j]a[k]}(i<k<j)。处理时注意边界即可。
贴代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int d[101][101],a[101]; 5 int dp(int i,int j) 6 { 7 int &ans = d[i][j]; 8 int k,temp; 9 if(ans != -1) 10 return ans; 11 if(i == j - 1) 12 { 13 ans = 0; 14 return ans; 15 } 16 if(i == j - 2) 17 { 18 ans = a[i] * a[i + 1] * a[j]; 19 return ans; 20 } 21 ans = 0xffffff; 22 for(int k = i + 1;k < j;k++) 23 { 24 temp = dp(i,k) + dp(k,j) + a[i] * a[k] * a[j]; 25 if(temp < ans) 26 ans = temp; 27 } 28 return ans; 29 } 30 int main() 31 { 32 int n,i; 33 while(cin>>n) 34 { 35 memset(d,-1,sizeof(d)); 36 for(i = 1;i <= n;i++) 37 cin>>a[i]; 38 int ans = dp(1,n); 39 cout<<ans<<endl; 40 /*for(int i = 1;i <= n;i++) 41 { 42 for(int j = 1;j <= n;j++) 43 { 44 cout<<dp(i,j)<<" "; 45 } 46 cout<<endl; 47 }*/ 48 } 49 return 0; 50 }