这道题的妙处在于把原问题看成矩阵连乘问题,求这些矩阵相乘的最小乘法次数,比如一个i*k矩阵乘一个k*j的矩阵,他们的乘法次数就是i*k*j (联想矩阵乘法的三层循环),题目说的取走一张牌,类似于矩阵相乘除去k,所以根据这个条件分析可以联想到矩阵。

题目要求首尾两端不可取,也就是求到最后只剩下一个矩阵(一共n-1个)。

用一个p数组就可以记录每个矩阵的行和列,比如:p[i],p[i+1],p[i+2]就可以表示一个i*(i+1)的矩阵和一个(i+1)*(i+2)的矩阵。

 1 #include<cstdio>
2 #include<cstring>
3 #include<vector>
4 #include<algorithm>
5 #include<stdlib.h>
6 #include<iostream>
7 #include<cmath>
8 using namespace std;
9 int dp[105][105],p[105];
10
11 int solve(int n){
12 for(int d=2;d<=n;d++)
13 for(int i=1;i<=n-d+1;i++){
14 int j=i+d-1;
15 dp[i][j]=dp[i+1][j]+p[i-1]*p[i]*p[j];//k=i的情况,因为要取min,先拿出来计算,否则最小值一直都是0
16 for(int k=i+1;k<j;k++)
17 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+p[i-1]*p[k]*p[j]);
18 }
19 return dp[1][n];
20 }
21
22 int main(){
23 int n;
24 scanf("%d",&n);
25 memset(dp,0,sizeof(dp));
26 for(int i=0;i<n;i++) scanf("%d",p+i);//用来存每个矩阵的行和列
27 printf("%d\n",solve(n-1));//n-1个矩阵
28 return 0;
29 }

POJ1651 Multiplication Puzzle (区间DP)的更多相关文章

  1. POJ1651:Multiplication Puzzle(区间DP)

    Description The multiplication puzzle is played with a row of cards, each containing a single positi ...

  2. poj 1651 Multiplication Puzzle (区间dp)

    题目链接:http://poj.org/problem?id=1651 Description The multiplication puzzle is played with a row of ca ...

  3. POJ 1651 Multiplication Puzzle 区间dp(水

    题目链接:id=1651">点击打开链 题意: 给定一个数组,每次能够选择内部的一个数 i 消除,获得的价值就是 a[i-1] * a[i] * a[i+1] 问最小价值 思路: dp ...

  4. POJ1651 Multiplication Puzzle —— DP 最优矩阵链乘 区间DP

    题目链接:https://vjudge.net/problem/POJ-1651 Multiplication Puzzle Time Limit: 1000MS   Memory Limit: 65 ...

  5. POJ1651:Multiplication Puzzle(区间dp)

    Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9419 Accepted: 5850 ...

  6. [ZOJ]3541 Last Puzzle (区间DP)

    ZOJ 3541 题目大意:有n个按钮,第i个按钮在按下ti 时间后回自动弹起,每个开关的位置是di,问什么策略按开关可以使所有的开关同时处于按下状态 Description There is one ...

  7. POJ1651Multiplication Puzzle[区间DP]

    Multiplication Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8737   Accepted:  ...

  8. poj1651 Multiplication Puzzle

    比较特别的区间dp.小的区间转移大的区间时,也要枚举断点.不过和普通的区间dp比,断点有特殊意义.表示断点是区间最后取走的点.而且一个区间表示两端都不取走时中间取走的最小花费. #include &l ...

  9. POJ1651 Multiplication Puzzle【区间DP】

    LINK 每次删除一个数,代价是左右两边相邻的数的当前数的积 第一个和最后一个数不能删除 问最后只剩下第一个数的最后一个数的最小代价 思路 很简单的DP 正着考虑没有办法确定两边的数 那么就把每个区间 ...

  10. poj1651 Multiplication Puzzle(简单区间dp)

    题目链接:http://poj.org/problem?id=1651 题意:一系列的数字,除了头尾不能动,每次取出一个数字,这个数字与左右相邻数字的乘积为其价值, 最后将所有价值加起来,要求最小值. ...

随机推荐

  1. CSS 导航栏底线向两边延伸动画

    利用元素向左移动的同时,宽度变长,实现两边延伸效果. react代码: <ul className="tab"> { moduleList.map((item: any ...

  2. python--函数参数传递

    1. 调用函数时,实参会传递给形参,叫做参数传递. 2. 根据实际参数的类型不同,函数参数的传递方式可分为 2 种,分别为值传递和引用(地址)传递: 值传递:传递的实参类型为不可变类型(字符串.数字. ...

  3. 我和Apache DolphinScheduler的缘分

    关于 DolphinScheduler社区 Apache DolphinScheduler(incubator) 于17年在易观数科立项,19年3月开源, 19 年8月进入Apache 孵化器,社区发 ...

  4. 从零开始Blazor Server(11)--编辑用户

    用户编辑和角色编辑几乎一模一样,这里先直接贴代码. @page "/user" @using BlazorLearn.Entity @using Furion.DataEncryp ...

  5. DevOps落地实践点滴和踩坑记录-(2) -聊聊平台建设

    很久没有写文章记录了,上一篇文章像流水账一样,把所见所闻一个个记录下来.这次专门聊聊DevOps平台的建设吧,有些新的体会和思考,希望给正在做这个事情的同学们一些启发吧. DevOps落地实践点滴和踩 ...

  6. js运算符和逻辑分支

    运算符 1.拼接运算符:+,加号两边只要有一边出现字符串就是拼接 2.算术运算符  如:2+3: 3.赋值运算符+=,-=,/=,*= 4.关系运算符>,<,==,=== != !== ! ...

  7. HCIA-Datacom 2.1 实验一:IPv4编址及IPv4路由基础实验

    实验目的 掌握接口IPv4地址的配置方法 理解LoopBack接口的作用与含义 理解直连路由的产生原则 掌握静态路由的配置方法并理解其生效的条件 掌握通过PING工具测试网络层联通性 掌握 ...

  8. SpringBean的实例化

    在Spring框架中,想使用Spring容器中的Bean,需要先实例化Bean SpringBean的实例化有3种方式 构造方法实例化 (最常用) 在Java配置类中,写一个构造方法,在这个构造方法中 ...

  9. 【java】学习路线10-权限修饰符详解

    /*关于修饰符:类:public default                public protected default privatesame class          √       ...

  10. Qt QBarSeries简易柱状图教程

    博客园最强Qt QBarSeries简易柱状图教程 前情提要 每个人的绘图需求不同,此篇教程也是根据需求来改的.我的需求大概如下所示. 通过信号槽的方式接收signals来刷新柱状图,所以每次触发信号 ...