POJ-1651 Multiplication Puzzle 矩阵连乘问题(区间dp)

题意

给我们n个数 让我们随意的跳出其中的数 每挑出一个数 计算代价为左边数* 当前数 * 右边的数
除了首尾两个数不选 中间的数可以任意挑 让我们求最小代价

CODE

#include<bits/stdc++.h>
using namespace std;
int a[110],m[110][110];
const int maxn = 0x7f7f7f;
int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++)m[i][i]=0;for(int l=2;l<n;l++){// 区间长度从2开始 1没意义 for(int i=1;i<=n-l+1;i++){// 起始点从2 开始  int j = i+l-1;m[i][j] = maxn;//  cout<<"L:"<<l<<" "<<i<<" "<<j<<":"<<endl;for(int k = i;k<j;k++){// 枚举最后一个选择的位置 int t = m[i][k]+m[k+1][j]+a[i-1]*a[k]*a[j];//本次结果就是从i到k连起来的最小+从k+1到j连起来的最小+本次连起来后的代价 //  cout<<i-1<<" "<<k<<" "<<j<<" "<<t<<endl;m[i][j] = min(t,m[i][j]);//  system("pause");}}}printf("%d\n",m[2][n]);return 0;
}

分析

这道题开始看非常蒙
这该怎么做?
其实这道题可以转化成矩阵连乘问题
我们定义从i到j的最小代价 其实就是从i 到k + 从k+1 到j的最小代价 + 中间分割的k的代价 把i到j之间的k枚举一遍取最小
所以就得到了两个子问题
我们知道两个矩阵相乘总计算量就是p* r * q(p*r,r * q的两个矩阵)
有没有发现这里有点相似
每相邻的两个数 就是矩阵的行和列
第i个矩阵式子为 a[i-1]*a[i]
所以从起始点从2开始才有意义
如果其实点从1开始没意义(a[i-1]为0 那么计算量为0)
第一个矩阵为前两个元素 开始那么他的参数就是
a[1]a[2]
所以这道题我们删掉一个元素时 或是从中心合并两个结果时
加上额外的代价
也就是a[i1]a[k]a[j]
这个就是 、
第一个矩阵 a[i1]a[k]
第二个矩阵a[k]a[j]
那么其抽象计算量就是
a[i1]a[k]a[j]
就相当于两个矩阵相乘的总计算量

所以下标从2开始有意义
例如 3
1 2 3
抽象成矩阵为 1×2 2×3
那么 答案就是 dp[2][n]
左边起始有意义的点为2 右边结束点其实就是n
为什么是n呢 因为如果不把n算在内 最终我们循环的
最大的j就是n 如果不考虑n 那么说明我们没考虑最后一个矩阵的最后一个参数
所以必须要时dp[2][n]
将原序列拆解后的矩阵序列
这道题其实就是相当于考虑剩余首尾两个元素
其余的全部拿出来的最小代价
注意第n个元素要算到第n-1个的计算量中 所以第n个元素在矩阵问题中就是最后一个参数
这个参数是要合并的

如果全取
我们所要输出就是dp[1][n+1]了
这个问题之所以可以抽象成矩阵问题
因为我们要提出2-n-1的数 然而在计算的过程中却把1和n也以a[i1]a[k]a[j]的形式算进去了
也就是能够表示出矩阵计算量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

The Apache Tomcat installation at this directory is version,tomcat

The Apache Tomcat installation at this directory is version,tomcat版本号过高eclipse无法导入解决办法 找到tomcat安装位置进入lib目录 lib目录下有个catalina.jar 用解压缩软件打开 打开后 在catalina.jar\org\apache\catalina\util目…

9.JSP运行原理与JSP页面的基本结构

JSP运行原理与JSP页面的基本结构 HTML页面的基本构成 .代码中出现的几种标签 •单标签 某些标签只需单独使用就能完整地表达意思&#xff0c;控制网页 效果&#xff0c;这类标签的语法是&#xff1a; <标签> 双标签 标签成对使用&#xff0c;由一个开始标签和一个结…

给定两个整数m和n,求出m~n这段连续的整数中所有偶数的平方和以及所有奇数的立方和。

//自己留着复习用 #include<stdio.h> int s(int a) { if (a%20) return aa; else return aa*a;} int main () {int i,m,n,s1,s2; scanf("%d %d",&m,&n);s1s20; for(im;i<n;i) { if(i%20) s1s1s(i); else s2s2s(i);} printf("%d %d",s…

[Leedcode][JAVA][第124题][二叉树中的最大路径和][递归][二叉树]

【问题描述】[困难] 给定一个非空二叉树&#xff0c;返回其最大路径和。本题中&#xff0c;路径被定义为一条从树中任意节点出发&#xff0c;达到任意节点的序列。该路径至少包含一个节点&#xff0c;且不一定经过根节点。示例 1:输入: [1,2,3]1/ \2 3输出: 6 示例 2:输入: …

SAS对数据变量的处理

SAS对数据变量的处理 在使用DATA步基于已经存在的数据集生成新数据集时&#xff0c;可以指定在新数据集中不需要包含的变量而仅读取其他变量&#xff0c;或者指定仅需要在 新数据集中包含的变量。该功能可以通过DATA步中的SET语句和数据集选项KEEP和DROP来实现&#xff0c;也可…

用类来实现输入输出时间,定义多个类对象分别输入输出各对象的时间(时:分:秒),使用函数,数据成员不再由键盘输入,而在调用函数时由实参给出,并在函数中使用默认参数

//个人留着复习用 #include using namespace std; class Time {public: int hour; //类 int minute; int sec; }; int main() {void settime(Time&,int hour0,int minute0,int sec0); //函数声明&#xff0c;制定了默认参数 void showtime(Time&); //函数声明 Tim…

POJ 2533 Longest Ordered Subsequence 动态规划

题意 本题求从1 到 n的最长上升子序列的长度 分析 最优化问题 考虑dp 我们求1-n最长上升子序列长度 假设记录在dp[n]中 假设我们已经知道了1—n-1的以第n-1为最后一个元素的最长上升序列的长度 那么我们拿到第n个元素不就可以判断如果这个n比n-1位置上的元素大 那么就…

那些ubuntu创建用户踩过的坑

在ubuntu中应该用adduser命令创建用户&#xff0c;而不是使用useradd. 各种Linux发行版是有差别的&#xff0c;我也是刚用过才知道的。转载于:https://www.cnblogs.com/April315/p/10496745.html

[剑指offer][JAVA]面试题第[30]题[包含min函数的栈][双栈辅助栈][单栈]

【问题描述】[中等] 定义栈的数据结构&#xff0c;请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中&#xff0c;调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-…

C语言-同码小数和

设和式s(d&#xff0c;n)0.d0.dd0.ddd…0.dd…d为n项同码d小数之和&#xff0c;其中第k项小数点后有连续k个数字d&#xff08;d1&#xff0c;2&#xff0c;…&#xff0c;9)。 例如&#xff1a;s&#xff08;7&#xff0c;4&#xff09;0.70.770.7770.7777 还有其他的解法 可…

12.多媒体和超链接标签及其应用实例

多媒体和超链接标签及其应用实例

POJ-3624 Charm Bracelet dp

题意 N个物品每个就一个给出每个物品的价值和花费&#xff0c;表示最终选择一些物品使得花费不超过M&#xff0c;使得价值最大化 分析 最优化问题 考虑dp n个物品选择一些得到最后的最优化问题 我们不妨考虑&#xff0c;假设我们得到了n-1个物品在容量为m情况下最优化值存…

[Leedcode][JAVA][面试题 16.18][模式匹配][字符串][枚举]

【问题描述】[中等] 你有两个字符串&#xff0c;即pattern和value。 pattern字符串由字母"a"和"b"组成&#xff0c;用于描述字符串中的模式。例如&#xff0c;字符串"catcatgocatgo"匹配模式"aabab"&#xff08;其中"cat"是…

C语言实现小数四舍五入

做日记笔记。 转载自https://blog.csdn.net/weixin_38505045/article/details/79994536 排版有更改 C语言中实现四舍五入: (int)(a0.5)即可。 很巧妙的用了取整规则。 也不用导入math.h 同样注意负数的情况。 把 换成 - 即可。 float f ……; int i (int)(f 0.5); i就是f…

CSS效果

效果属性 box-shadow/text-shadow/border-radius/background/clip-path box-shadow 图形阴影 <style type"text/css">.container{width: 50px;height:50px;background: red;box-shadow: 5px 5px 10px rgba(0,0,0,0.5)} </style> <body><div cla…

POJ-1384 Piggy-Bank 多重背包变形

题意 给我们一个容器的容量m n个物品 每个物品有不同的花费和价值 问我们再每个物品无限个的情况下 最后正好装满最后得到的最小价值是多少 如果装不满 就输出impossible 分析 目标状态&#xff1a;最小价值策略 限制条件&#xff1a;正好装满m的容量 多重背包模型 每个物…

13.表格标签及其应用实例

表格标签及其应用实例

1.6解不等式 1.6.1 平方根不等式

//《至美——C程序设计》 在这个前辈的代码上改了一点 S1赋值&#xff0c; s1 1; //赋值 如果提前未赋值会有警告&#xff0c;所以我就想赋值。然后我是在for循环里写的 while (1){m;s 0;s1 1;for (i m; i < 2 * m; i)s sqrt(i); /*对每一个m计算和s*/这会运行结果…