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" 分析题意 每个亡灵至少一个花瓣,相邻的亡灵中思念值高的要获得的花瓣高(思念值相等是不需要花瓣一样多的).主要考贪心思路,为了使得花瓣总量最少, ...
随机推荐
- devcloud
zone名字:devcloud 外网dns:8.8.8.8 内网dns:10.0.2.3 提供点名称:devcloud cs bug问题:https://issues.apache.org/j ...
- Python 解析配置模块之ConfigParser详解-乾颐堂
1.基本的读取配置文件 -read(filename) 直接读取ini文件内容 -sections() 得到所有的section,并以列表的形式返回 -options(section) 得到该sect ...
- N-Gram的数据结构
ARPA的n-gram语法如下: [html] view plaincopyprint? \data\ ngram 1=64000 ngram 2=522530 ngram 3=173445 \1-g ...
- sscanf高级用法级正则表达式
sscanf高级用法级正则表达式 摘自:https://www.cnblogs.com/bluestorm/p/6864540.html sscanf与scanf类似,都是用于输入的,只是后者以屏幕 ...
- js失效的原因及解决方式
1.在head中先引用了js文件再引用jquery,应先引用jquery 2.js文件中所有代码应包含在$(function(){ });中
- libxml2
http://www.xmlsoft.org/downloads.html 建议直接用openscenegraph下载的3rdparty:http://www.openscenegraph.org ...
- Introducing .NET Standard
https://blogs.msdn.microsoft.com/dotnet/2016/10/18/the-week-in-net-bond-the-gallery/ .NET Standard s ...
- javascript总结30 :DOM事件
事件: 1 在js中可以说一整套事件能完成一个功能: 事件的定义:当什么时候执行什么事: 使用事件的基本结构:事件源+事件类型=执行的指令 2 事件三要素:事件源 事件类型, 驱动程序(匿名函数). ...
- 用jvm指令分析String 常量池
其他博友的不同理解方式: http://hi.baidu.com/boywell/item/d5ee5b0cc0af55c875cd3cfd 我们先来看一个类 public class javaPT ...
- Exception (2) Java Exception Handling
The Java programming language uses exceptions to handle errors and other exceptional events.An excep ...