码迷,mamicode.com
首页 > 其他好文 > 详细

poj 1651

时间:2015-02-04 10:44:56      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

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

 

poj 1651

标签:

原文地址:http://www.cnblogs.com/cnblogs321114287/p/4271601.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!