NYoj536 矩阵链乘】的更多相关文章

经典问题没啥说的 #include<stdio.h> #include<string.h> #define max 100+1 #define min(a,b) (a<b?a:b) typedef long long LL; LL dp[max][max]; int p[max]; int main(){     int n;     while(~scanf("%d",&n)){         int i,j,k,l;         for(…
题目描述: 输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数.如果乘法无法进行,输出error. Sample Input 9 A 50 10 B 10 20 C 20 5 D 30 35 E 35 15 F 15 5 G 5 10 H 10 20 I 20 25 A B C (AA) (AB) (AC) (A(BC)) ((AB)C) (((((DE)F)G)H)I) (D(E(F(G(HI))))) ((D(EF))((GH)I)) Sample Output 0 0 0 error…
题目链接. 题目大意: 给定一个n,和两个序列a[i], p[i]. a[i] 表示需要购买 i品质 的数量,p[i] i 等级的价格. 1.每个品质都会有不同的价格,价格依据品质上升而上升 2.买一次 i 品质,都要加上10个 i 品质 价格的手续费. 3.可一用高品质的代替低品质. 求最少的花费. 分析: 这题就简单地矩阵链乘法(<算法导论>第15章,动态规划). 用 dp[i][j] 表示购买 i 品质到 j 的最少的花费. dp[i][j] = min{dp[i][k]+dp[k+1]…
传送门:http://oj.cnuschool.org.cn/oj/home/solution.htm?solutionID=35454 20603矩阵链乘 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 输入n个矩阵的维度和一些矩阵链乘的表达式,输出乘法的次数.如果乘法无法进行,输出error.假定A是m*n矩阵,B是n*p矩阵,则乘法的次数为m*n*p.如果矩阵A的列数不等于矩阵B的行数,则这两个矩阵无法进行乘法运算.例…
动态规划--矩阵链乘法 1.矩阵乘法       Note:只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义.一个m×r的矩阵A左乘一个r×n的矩阵B,会得到一个m×n的矩阵C. #include <iostream> using namespace std; #define A_ROWS 3 #define A_COLUMNS 2 #define B_ROWS 2 #define B_COLUMNS 3 void matrix_multiply(int A[A_ROWS][A_COLUM…
http://codevs.cn/problem/3546/ 题目 给定有n个要相乘的矩阵构成的序列(链)<A1,A2,A3,.......,An>,要计算乘积A1A2.....An.一组矩阵是加全部括号的.矩阵链加括号对运算的性能有很大影响. 仅当两个矩阵A和B相容(即A的列数等于B的行数),才可以进行相乘运算.如果A是一个p×q矩阵,B是q×r矩阵,结果C是p×r的矩阵.计算C的时间由乘法运算次数决定的,次数为p×q×r. 矩阵链乘法问题可表述为:给定n个矩阵构成的一个链<A1,A2…
https://vjudge.net/problem/UVA-10003 题意: 有一根长度为L的棍子,还有n个切割点的位置.你的任务是在这些切割点的位置处把棍子切成n+1部分,使得总切割费用最小.每次切割的费用等于被切割的木棍长度.例如,L=10,切割点为2,4,7.如果按照2,4,7的顺序,费用为10+8+6=4,如果按照4,2,7的顺序,费用为10+4+6=0. 思路: 这道题目和最优矩阵链乘是一样的,方法是按照区间大小递增的顺序递推,因为长区间的值依赖于短区间的值. 设d(i,j)为切割…
Matrix-chain product. The following are some instances. a)       <3, 5, 2, 1,10> b)       <2, 7, 3, 6, 10> c)       <10, 3, 15, 12, 7, 2> d)       <7, 2, 4, 15, 20, 5> 矩阵链乘积: 应用动态规划方法: 1.刻画一个最优解的结构特征 2.递归地定义最优解的值 3.计算最优解的值,采用自底向上的方…
题目链接:https://vjudge.net/problem/POJ-1651 Multiplication Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11239   Accepted: 6980 Description The multiplication puzzle is played with a row of cards, each containing a single positive…
这是<算法导论>动态规划中的一个问题.问题简述如下:我们在求解矩阵相乘时通常会有一个最优括号方案来对矩阵进行顺序相乘,这样会减少大量的计算时间. 我们知道矩阵A.B相乘,只能是当矩阵A的列数等于矩阵B的行数时才能进行相乘,且假设A·B = C,A为p×q规模的矩阵,B为q×r的矩阵,则乘积C的规模为p×r的矩阵.计算A·B所需的时间由乘法次数决定,即pqr. 例如:有三个矩阵的规模分别为:A = 10×100,B = 100×5,C = 5×50.如果按顺序(AB)C计算,则需要10×100×…
题意:给出n个矩阵组成的序列,问最少的运算量 看的紫书: dp[i][j]表示从第i个矩阵到第j个矩阵最少的乘法次数 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+p[i-1]*p[k]*p[j]); 边界条件为dp[i][i]=0,因为从一个矩阵自己到它自己不需要做乘法 然后把dp[i][j]初始化为一个极大的值,再来求最小值 学习的这一篇:http://blog.csdn.net/dgq8211/article/details/7492186 还有这一篇…
#include<string.h> //区间dp的思想#include<iostream> //将一个区间分成两段,将每一段当成是一个矩阵#include<stdio.h> //求min(dpp(start,i)+dpp(i+1,end)+a[start-1]*a[end]*a[i])using namespace std;int min(int x,int y){ return x<y?x:y;}int dp[105][105];int a[105];int…
意甲冠军  由于矩阵乘法计算链表达的数量,需要的计算  后的电流等于行的矩阵的矩阵的列数  他们乘足够的人才  非法输出error 输入是严格合法的  即使仅仅有两个相乘也会用括号括起来  并且括号中最多有两个 那么就非常easy了 遇到字母直接入栈  遇到反括号计算后入栈  然后就得到结果了 #include<cstdio> #include<cctype> #include<cstring> using namespace std; const int N = 10…
结构体 struct matrix 用来保存矩阵的行和列: map<string,matrix> 用来保存矩阵名和相应的行列数: stack<string> 用来保存表达式中遇到的矩阵名,并将每次乘法运算后的矩阵压入栈中: C++11 代码如下: #include<iostream> #include<map> #include<string> #include<stack> using namespace std; struct m…
[算法]区间DP [题解] 注意先输出右括号后输出左括号. f[i][i+x-1]=min(f[i][i+x-1],f[i][j]+f[j+1][i+x-1]+p[i]*p[j+1]*p[i+x]) x为当前区间长度,i为左端点,i+x-1为右端点,j为分割点. 矩阵Ai为Pi*Pi+1. 初始值f[i][i]=0,其它为inf. #include<cstdio> #include<algorithm> #include<cstring> using namespace…
这道题我写了两种写法 一种利用逆元 a/b%mod=a*c%mod; (c是b的逆元)易得2的逆元就是5~~~04: 一种是矩阵快速幂 利用递推式得出结论 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; int read(){ ,f=,c=getchar(); ; c=getchar();} +(c-'); c=getchar();} return ans*f;…
传送门 •题意 矩阵 A(n×m) 和矩阵 B(m×k) 相乘,共做 n×m×k 次乘法运算: 给你 n 个矩阵,求这 n 个矩阵的最优结合方式,使得做的总乘法运算次数最少: •题解 定义dp(i,j)表示第[i,...j]个矩阵的最小的乘法运算次数: 定义d(i,j)表示第[i,...j]个矩阵的最优解从d(i,j)分开,即(Ai×Ai+1×......×Ad(i,j))×(Ad(i,j)+1×......×Aj): 求解dp(i,j)的时候,求出最优解,并记录是从那个位置分开使得其最优: 输…
假设你必须做A*B*C*D*E的运算,在这里A,B,C,D,E都是矩阵(matrix).由于矩阵相乘具有连接性(associative),所以相乘的顺序可以是任意的.然而所需要的基本乘法数却与不尽相同. 例如:A是个50*10的矩阵,B是个10*20的矩阵,C是个20*5的矩阵.那么就有2种不同的表示式来求出A*B*C.分别是(A*B)*C和A*(B*C).而其所需用到的基本乘法数前者为15000次,后者为3500次. 给你某一种矩阵相乘的表示式,你的任务是写一个程序算出需要多少个基本乘法. I…
题意: 这道题也是在不改变原序列每个元素位置的前提下,看每个元素与他身边的两个元素那个先结合能得到最大的能量 题解: 很明显这是一道区间dp的题目,这道题要断环成链,这道题需要考虑在这个区间上某个元素先与那个元素结合更好,而如果我们采用了区间dp的模板,那么我们就在dp中不用考虑某个元素先于左右那个结合,因为区间dp的模板已经做到了这一点 i是起点,j是终点,k就是枚举父区间是由哪两个子区间合并而成的 dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+v[i]*…
Multiplication Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8040   Accepted: 4979 Description The multiplication puzzle is played with a row of cards, each containing a single positive integer. During the move player takes one…
Input Specification Input consists of two parts: a list of matrices and a list of expressions. The first line of the input file contains one integer n (  ), representing the number of matrices in the first part. The next n lines each contain one capi…
题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1029 题目大意: 题同乘法难题.给n+1个数,头尾不能动,中间的数可取出,取出时代价是现在该数和左右的乘积.求最小代价. 题目思路: [动态规划] 区间动规. f[i][j]表示从i到j的最小代价. 枚举区间[i,j]中最后取出的是第k个数,则转移方程为f[i][k]+f[k][j]+a[i]*a[k]*a[j] // //by coolxxx // #include<iostrea…
较为简单的栈题 思路比较好 一次ac 1.char word :word=A:直接  a[word]=xxxx,不用 a[‘word’]=xxxx #include<bits/stdc++.h> using namespace std; struct aaa { int x; int y; }a[]; int main() { stack<aaa>k; int n; cin>>n;getchar(); ;i<=n;i++) { char word;cin>&…
这是神题,n <= 1000,如果是极限数据普通的n^3区间DP怎么可能过?可偏偏就过了. 刘汝佳大哥的训练指南上面说的存在nlgn的算法解决矩阵链乘问题,可是百度都找不到.... AC代码 #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <utility> #include <string> #include…
前篇戳:dp入门——由分杆问题认识动态规划 导语 刷过一些算法题,就会十分珍惜“方法论”这种东西.Leetcode上只有题目.讨论和答案,没有方法论.往往答案看起来十分切中要害,但是从看题目到得到思路的那一段,就是绕不过去.楼主有段时间曾把这个过程归结于智商和灵感的结合,直到有天为了搞懂Leetcode上一位老兄的题型总结,花两天时间学习了回溯法,突然有种惊为天人的感觉——原来真正掌握一个算法是应该触类旁通的,而不是将题中一个细节换掉就又成了新题…… 掌握方法论绝对是一种很爽的感觉.看起来好像很…
一.动态规划的基本思想 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解. 将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解.适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的.若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次.如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间.为了…
  算法提高 矩阵乘法   时间限制:3.0s   内存限制:256.0MB      问题描述 有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要将它们依次相乘,只能使用结合率,求最少需要多少次运算. 两个大小分别为p*q和q*r的矩阵相乘时的运算次数计为p*q*r. 输入格式 输入的第一行包含一个整数n,表示矩阵的个数. 第二行包含n+1个数,表示给定的矩阵. 输出格式 输出一个整数,表示最少的运算次数. 样例输入 31 10 5 20 样…
参考:http://www.cppblog.com/wicbnu/archive/2013/03/18/198565.html 我太喜欢用dfs和回溯法了,但是这些暴力的方法加上剪枝之后复杂度依然是很高,显然不能达到题目的要求. 这个时候应该考虑动态规划,并且要复杂度尽量接近O(n^2)的算法. 下面这个方法更加简洁:自长到短找到回文串后,往后dfs,并记录递归深度表示并更新最小划分数.http://fisherlei.blogspot.com/2013/03/leetcode-palindro…
今天练了一波DP.时间紧迫我就只贴代码了. 20141120 fzu2129 http://acm.fzu.edu.cn/problem.php?pid=2129 不同的子序列个数 //#pragma comment(linker, "/STACK:102400000,102400000") #include<cstdio> #include<cmath> #include<iostream> #include<cstring> #inc…
题目很肤浅.. 但是这件事我们要做.. 那么有一种方法叫做刷表法.. 当你发现这个问题具有最优子结构,重叠子问题时 那么这是一个dp问题是使用本方法的前提 画出该dp状态所对应的矩阵 画出转移关系线...找出前置依赖的所有状态 如果我们能找到该表的一个遍历顺序可以使得 每次计算都依赖之前已经计算好的结果计算出来 那么我们就能正确地写出这个dp的递推写法 举个例子..矩阵链乘法是按dp表对角线转移 而最长公共子序列就正常m*n地for转移 ============= 这是解决dp问题的一个典型的d…