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 }