题意:一系列的数字,除了头尾不能动,每次取出一个数字,这个数字与左右相邻数字的乘积为其价值,最后将所有价值加起来,要求最小值
思路:求出每个区间的最小值,一直扩散到整个区间
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 }