SHUOJ - 算法题1 矩阵连乘问题(区间dp)
分析:设\(dp[i][j]\)为矩阵\(A[i:j]\)所需的最少乘法次数,则有dp方程:\(dp[i][j]=min\{dp[i][k]+dp[k+1][j]\}(i\leq k <j)\),当\(i=j\)时,\(dp[i][j]=0\).
则可以递归求解该问题,递归终止的条件是\(i=j\),自底向上地解决问题。枚举\([i,j)\)之间的每个k,并取其最小值。
因为该题需要输出解决方案,所以求解时,若\(dp[i][j] = dp[i][k]+dp[k+1][j]\),则用数组\(path[i][j]\)记录下这个k。
输出结果时,仍采用递归的方式,将一个括号内的视作一个子结构,递归终止的条件是区间中的元素仅有一个,此时打印单个矩阵。注意除了最外层的区间不用输出括号,加特判即可。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e2+5;
const int INF=0x3f3f3f3f;
typedef long long LL;
int a[maxn],b[maxn];
LL dp[maxn][maxn];
int path[maxn][maxn];
int n;
int dfs(int i,int j)
{
LL &ans=dp[i][j];
if(ans<INF) return ans;
if(i==j) return ans=0;
for(int k=i;k<j;k++){
int tmp=dfs(i,k)+dfs(k+1,j)+a[i]*b[k]*b[j]; //递归求解
if(tmp<ans){
ans=tmp; //不断更新最小值和其路径
path[i][j]=k;
}
}
return ans;
}
void print(int i,int j)
{
if(i==j){ //递归终止
printf("A%d",i); //输出独立矩阵
return;
}
if(i>1||j<n) printf("("); //最外层不要括号
print(i,path[i][j]); //递归进入子区间
print(path[i][j]+1,j);
if(i>1||j<n) printf(")"); //最外层不要括号
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int cas=0;
while(scanf("%d",&n)==1){
for(int i=1;i<=n+1;i++){
scanf("%d",&a[i]);
if(i>1) b[i-1] = a[i]; //后一个矩阵的行数等于前一个矩阵的列数
}
memset(dp,INF,sizeof(dp)); //初值置无穷大
memset(path,0,sizeof(path)); //路径
dp[1][n]=dfs(1,n);
printf("Case %d\n",++cas);
printf("%lld ",dp[1][n]);
print(1,n);
printf("\n");
}
return 0;
}
SHUOJ - 算法题1 矩阵连乘问题(区间dp)的更多相关文章
- P1005 矩阵取数游戏[区间dp]
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的\(m*n\)的矩阵,矩阵中的每个元素\(a_{i,j}\)均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n个.经过m次后 ...
- P1005 矩阵取数游戏 区间dp 高精度
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...
- 1166 矩阵取数游戏[区间dp+高精度]
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [ ...
- ZOJ 1276 "Optimal Array Multiplication Sequence"(最优矩阵链乘问题+区间DP)
传送门 •题意 矩阵 A(n×m) 和矩阵 B(m×k) 相乘,共做 n×m×k 次乘法运算: 给你 n 个矩阵,求这 n 个矩阵的最优结合方式,使得做的总乘法运算次数最少: •题解 定义dp(i,j ...
- 最优矩阵连乘问题 区间DP
最优矩阵连乘积 Accepted: 10 Total Submit: 18Time Limit: 1000ms Memony Limit: 32768KB Description 在科学计算中经常要计 ...
- Good Vegetable 4级算法题 分值: [320/3120] 问题: [8/78]
1523 非回文 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个字符串是非回文的,当且仅当,他只由前p个小写字母 ...
- 面试必备:高频算法题终章「图文解析 + 范例代码」之 矩阵 二进制 + 位运算 + LRU 合集
Attention 秋招接近尾声,我总结了 牛客.WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对.测试.欢迎食用 本 ...
- 经典算法题每日演练——第十七题 Dijkstra算法
原文:经典算法题每日演练--第十七题 Dijkstra算法 或许在生活中,经常会碰到针对某一个问题,在众多的限制条件下,如何去寻找一个最优解?可能大家想到了很多诸如“线性规划”,“动态规划” 这些经典 ...
- 经典算法题每日演练——第十六题 Kruskal算法
原文:经典算法题每日演练--第十六题 Kruskal算法 这篇我们看看第二种生成树的Kruskal算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的. 一:思想 若存在M={0, ...
随机推荐
- Linq系列(5)——表达式树之案例应用
在进入今天的正题之前,先感慨下本人的blog的人气一篇不如一篇.再加上换公司后人身自由受到了比之前大得多得多的限制,实在令本人有些郁闷.不过每次提笔写些东西跟大家分享,总是能让我感到愉悦和欣慰,希望我 ...
- 显示图片中CDC和HDC问题
(m_Pic.LoadPictureData(pBuffer, nSize));//接作调用函数读pBuffer的jpg数据准备显示 showimage();//显示图片 void Caccess_t ...
- Microsoft Word、Excel、PowerPoint转Pdf
Worksheet.ExportAsFixedFormat Method Mark: The ExportAsFixedFormat method is used to publish a workb ...
- Laravel5.1 搭建博客 --编译前端文件
上篇文章写了Gulp编译前端文件,这篇记录下在搭建博客中使用Gulp 1 引入bootstrap和js 1.1 首先先在项目本地安装Bower sudo npm install bower 1.2 创 ...
- ORA-00972: 标识符过长
若是拼接成的sql语句,请查找传递参数时字符型字段是否两边少了引号.
- c++多线程例(互斥体,共同访问)
<pre name="code" class="cpp">//这是2个线程模拟卖火车票的小程序 #include <windows.h> ...
- awk sed grep 详解
Linux的文本处理工具浅谈 awk [功能说明] 用于文本处理的语言(取行,过滤),支持正则 NR代表行数,$n取某一列,$NF最后一列 NR==20,NR==30 从20行到30行 FS竖着切,列 ...
- 【BZOJ2553】[BeiJing2011]禁忌 AC自动机+期望DP+矩阵乘法
[BZOJ2553][BeiJing2011]禁忌 Description Magic Land上的人们总是提起那个传说:他们的祖先John在那个东方岛屿帮助Koishi与其姐姐Satori最终战平. ...
- ios 将图片做成圆形
UIImageView * imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"oiuyfdsa.png ...
- LeetCode 笔记系列 18 Maximal Rectangle [学以致用]
题目: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones ...