Multiplication Puzzle POJ - 1651

原题链接

考察:区间dp

这题没做出来,要不我还是别学OI了...

思路:

       f[i][j]表示[i,j]区间内取得的最小值.集合划分就是以中断点为标准,k = i+1,i+2...j-1...f[i][j] = min(f[i][k]+f[k][j]+a[i]*a[k]*a[j])

      为什么是a[i]*a[k]*a[j]呢?f[i][k]考虑将(i,k)区间内的数取完,同理k,j.两边的数就明显是i,j了.

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <cstdio>
 5 using namespace std;
 6 const int N = 110;
 7 int a[N],f[N][N];
 8 int main()
 9 {
10     int n;
11     scanf("%d",&n);
12     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
13     for(int len=3;len<=n;len++)
14       for(int l=1;l+len-1<=n;l++)
15       {
16            int r = l+len-1;
17            f[l][r] = 0x3f3f3f3f;
18            for(int k=l+1;k<r;k++)
19              f[l][r] = min(f[l][k]+f[k][r]+a[l]*a[k]*a[r],f[l][r]);
20       }
21     printf("%d\n",f[1][n]);
22     return 0;
23 }

 

posted @ 2021-02-11 22:48  acmloser  阅读(29)  评论(0编辑  收藏  举报