poj 1651 Multiplication Puzzle

题意:一系列的数字,除了头尾不能动,每次取出一个数字,这个数字与左右相邻数字的乘积为其价值,最后将所有价值加起来,要求最小值
思路:求出每个区间的最小值,一直扩散到整个区间
 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<set>
 9 #include<queue> 
10 #include<algorithm>  
11 using namespace std;
12 
13 int dp[1005][1005];
14 int ans[1005];
15 
16 int main()
17 {
18     int num;
19     while(cin>>num)
20     {
21         for(int i=1;i<=num;i++)
22             scanf("%d",&ans[i]);
23         memset(dp,0,sizeof(dp));
24         for(int l=2;l<num;l++)//长度从2开始枚举  
25         {  
26             for(int i=2;i+l<=num+1;i++)  
27             {  
28                 int j=i+l-1;  
29                 dp[i][j] = 100000000;  
30                 for(int k=i;k<j;k++)//枚举中点  
31                     dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]+ans[i-1]*ans[k]*ans[j]);  
32             }  
33         }  
34         printf("%d\n",dp[2][num]);
35     }
36     return 0;
37 }

 

posted @ 2016-05-20 19:23  pter  阅读(143)  评论(0编辑  收藏  举报