标签:
给出一组N个数,每次从中抽出一个数(第一和最后一个不能抽),该次的得分即为抽出的数与相邻两个数的乘积。直到只剩下首尾两个数为止。问最小得分是多少?
1 #include <iostream> 2 using namespace std; 3 #define max 105 4 int dp[max][max]; 5 int a[max]; 6 int min(int a,int b) 7 { 8 return a>b?b:a; 9 } 10 int main() 11 { 12 int n; 13 cin>>n; 14 int i,j,k; 15 for(i=0;i<n;i++) 16 cin>>a[i]; 17 for(i=0;i<n-2;i++) 18 dp[i][i+2]=a[i]*a[i+1]*a[i+2]; 19 int len; 20 for(len=3;len<n;len++) 21 for(i=0;i+len<n;i++) 22 { 23 j=i+len; 24 for(k=i+1;k<j;k++) 25 { 26 if(dp[i][j]==0) 27 dp[i][j]=dp[i][k]+dp[k][j]+a[i]*a[k]*a[j]; 28 else 29 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+a[i]*a[j]*a[k]); 30 } 31 } 32 cout<<dp[0][n-1]<<endl; 33 34 return 0; 35 }
标签:
原文地址:http://www.cnblogs.com/cnblogs321114287/p/4271601.html