2016级算法第四次上机-A.Bamboo 和人工zz
2024-08-29 03:22:01
Bamboo和人工ZZ
题意:
非常直白,经典的动态规划矩阵链乘问题
分析:
矩阵链A1A2..An满足结合律,可以使用加括号的方式,降低运算代价。
一个pq的矩阵和一个qr的矩阵相乘,计算代价为pqr
加括号时满足动态规划的特性
长度为1的矩阵不需要加括号
长度>=2的矩阵链AiAi+1.....Aj,势必在 Ak和Ak+1之间加括号,分成的两组中各自的加括号方案已经是最优的了。
以m[i][j]表示Ai-Aj矩阵链乘的代价,则
核心语句:
i=j m[i][j]=0;
i<j m[i][j] = min(m[i][k] + m[k+1][j] + pi-1pkpj); i<=k<j
l:矩阵链长度,长度为1无需考虑
i:与j遍历所有长度为l的矩阵链
k:遍历所有可能的分割点
保留最小的方案
输出括号化方案,s[i][j]记录分割点k,递归输出方案。注意左边优先,有两种方式,可以在判断if(q<=m[i][j])时加上等号;或者内层的k循环倒序
伪代码
int p[]
int m[][]
int s[][]
void Multiply()
{
Initialization of m[][]
for l = 2:n
for i = 1: n-l+1
j = i+l-1
m[i][j]= INF
for k = i:=j-1
q = m[i][k]+m[k+1][j]+ p[i-1]*p[k]*p[j]
if(q<=m[i][j])
m[i][j] = q
s[i][j] = k
end
end
end
}
void Print( i, j)
{
if(i==j)
printf("A%d",i)
else
printf("(")
Print(i,s[i][j])
Print(s[i][j]+1, j)
printf(")")
end
}
代码如下:
#include<stdio.h>
#include<math.h>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int p[310];
int m[305][305];
int s[305][305];
const int INF = 1<<30;
void Mulity(int n)
{
for(int i = 0;i<=n;i++)
m[i][i] = 0;
for(int l = 2; l<=n;l++)
for(int i = 1; i<= n-l+1;i++)
{
int j = i+l-1;
m[i][j]= INF;
for(int k = i;k<=j-1;k++)
{
int q = m[i][k]+m[k+1][j]+ p[i-1]*p[k]*p[j];
if(q<=m[i][j])
{m[i][j] = q;
s[i][j] = k;
}
}
}
}
void Print(int i,int j)
{
if(i==j)
printf("A%d",i);
else
{
printf("(");
Print(i,s[i][j]);
Print(s[i][j]+1, j);
printf(")");
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i = 0;i<=n;i++)
scanf("%d",&p[i]);
Mulity(n);
printf("%d\n",m[1][n]);
Print(1,n);
printf("\n");
}
}
最新文章
- Python学习笔记(基本功能的使用)
- iOS 蓝牙开发(二)iOS 连接外设的代码实现(转)
- word-break、word-wrap和其他文字属性
- 【javascript基础】1、基本概念
- keepalived初探
- 解决Oracle忘记密码问题
- SQL删除重复数据方法
- DOM 的选择器 API
- 在C#中使用CastleDynamicProxy 实现AOP
- restrictkeyword
- 5.1Python数据处理篇之Sympy系列(一)---Sympy的大体认识
- 面试经验合集-Java后端<;一>;
- angular 1.2.29版本下 动态添加多个表单、 校验全部、 提交 、ng-form方案
- Redis Bgrewriteaof 命令
- python 简明教程 【转】
- 论文翻译技巧--Notepad替换回车
- 2017-2018-4 20155203《网络对抗技术》Exp3 免杀原理与实践
- lua--clone
- jenkins系列(9)--插件之Archive The Artifacts
- HDU 1316 (斐波那契数列,大数相加,大数比较大小)