2016级算法第四次上机-A.Bamboo 和人工zz
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");
}
}
2016级算法第四次上机-A.Bamboo 和人工zz的更多相关文章
- 2016级算法第四次上机-E.Bamboo and the Ancient Spell
Bamboo and the Ancient Spell 分析 可能英文读题难度比较大,但是只要看到全大写的 "THE LONGEST COMMON SUBSEQUENCE !"应 ...
- 2016级算法第四次上机-F.AlvinZH的最“长”公共子序列
940 AlvinZH的最"长"公共子序列 思路 DP,难题. \(dp[i][j]\) :记录A的前i个字符与B的前j个字符变成相同需要的最小操作数. 初始化:dp[i][0] ...
- 2016级算法第四次上机-D.AlvinZH的1021实验plus
978 AlvinZH的1021实验plus 思路 贪心,中等题. 使用miss变量表示未覆盖的最小数字,初始值为1. 初始覆盖区间为[1,miss),目标是覆盖[1,m],即miss需要大于m. 需 ...
- 2016级算法第四次上机-B ModricWang的序列问题
1019 ModricWang的序列问题 思路 此题题意非常清晰,给定一个序列,求出最长上升子序列的长度.从数据规模来看,需要\(O(nlogn)\) 的算法. \(O(nlongn)\) 求最长上升 ...
- 2016级算法第四次上机-G.ModricWang的序列问题 II
1021 ModricWang的序列问题II 思路 此题与上一题区别不是很大,只是增加了一个长度限制,当场通过的人数就少了很多. 大体解题过程与上一题相同.区别在于对\(f[]\) 的操作.没有长度限 ...
- 2016级算法第四次上机-C.AlvinZH的1021实验
975 AlvinZH的1021实验 思路 贪心,简单题. 题目已经说明有且只有一种方法表示所求数,简单列举几项可以发现只由前i个砝码会可以表示[1,∑Wi]的所有数的.先找到最大需要的砝码Wi,问题 ...
- 2016级算法第六次上机-E.Bamboo之吃我一拳
Bamboo之吃我一拳 分析 当两个点的距离<=d时,才可以出拳,想要使得满足出拳条件的点对最少但不为0 寻找最近点对距离,得到的最近距离能够使得可以出拳的组数最少,因为除了最近点对外其他组合均 ...
- 2016级算法第六次上机-A.Bamboo之寻找小金刚
Bamboo之寻找小金刚 分析 可以抽象为许多连续线段,分别计数左拐和右拐的个数.考察叉积的基础应用. 假设ABC三点构成一个夹角∠ABC,B就是拐点,AC是辅助形成夹角.考虑线段AB和BC形成的向量 ...
- 2016级算法第五次上机-C.Bamboo和"Coco"
1064 Bamboo和"Coco" 分析题意 每个亡灵至少一个花瓣,相邻的亡灵中思念值高的要获得的花瓣高(思念值相等是不需要花瓣一样多的).主要考贪心思路,为了使得花瓣总量最少, ...
随机推荐
- linux系统中的变量
一.定义 所谓的变量,就是就是利用一个特定的"名称"(name)来存取一段可以变化的"值"(value),简单说来就是“用一个名称储存一个数值”. 二.设定 ...
- 跨版本mysqldump恢复报错Errno1449
已经有一套主从mysql,新增两个slave主库Server version: 5.6.22-log MySQL Community Server (GPL)旧从库Server version: 5. ...
- Runnable和Thread实现多线程的区别(含代码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17161237 Java中实现多线程有两种方法:继承Thread类.实现Runnable接口 ...
- Red Hat Cluster Suite 组件 fencing FAQ
说明 Red Hat Cluster实现HA的关键组件之一是fencing.没有设置fencing,虽然看上去也能够运行Cluster,但是一旦遇到故障切换就会出现异 常,所以深入理解fencing原 ...
- shiro 实现 网站登录记住我功能 学习记录(四)
在很多网站都有在登录的时候,比如说记住我 几天之内 只要再此打开这个网站,都不需要再登录的情况: 1.前台JSP增加 单选框:记住我 如 2.在处理登录的 Controller 代码中增加接收这个参 ...
- WebAPI的路由规则
1.自定义路由 public static class WebApiConfig { public static void Register(HttpConfiguration config) { / ...
- 十万个为什么:现在还没发现“虚函数virtual”和多态性的优点,估计是因为我还没有编程序吧。
十万个为什么:现在还没发现“虚函数virtual”和多态性的优点,估计是因为我还没有编程序吧.
- Go 面向对象概念
前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...
- RobotFramework与Jenkins集成后构建成功率高于设置阈值但总是显示失败
摘要:robot执行后总是失败 1.在配置jenkins的job时,添加构建步骤Execute Windows batch command,输入执行robotframework测试用例命令 2.然后j ...
- 搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡
转载:https://www.cnblogs.com/xiongze520/p/10308720.html 分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟 ...