首页 > 代码库 > poj 1651

poj 1651

给出一组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                     else29                         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 }

 

poj 1651