首页 > 其他 > 详细

Multiplication Puzzle POJ - 1651

时间:2021-02-12 08:13:21      阅读:44      评论:0      收藏:0      [点我收藏+]

原题链接

考察:区间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 }

 

Multiplication Puzzle POJ - 1651

原文:https://www.cnblogs.com/newblg/p/14398272.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!