本题的算法是动态规划,这里面f是一个滚动数组。如果不滚动的话,f[i,j]表示到第i分钟为止,Bessy恰移动j次所能接到的最多的苹果数。状态转移方程为:
f[0,j]=0
f[i,0]=f[i-1,0]+第i分钟1号树是否掉下苹果
f[i,j]=max { f[i-1,j-1], f[i-1,j] } + 第i分钟时Bessy所站的树是否掉下苹果(大括号里的两项分别对应“动”和“不动”两种决策)
程序里两重循环里那个比较费解的p就是计算第i分钟时Bessy移动j次后所站的树是否掉下苹果。首先读入p并将之减1,结果就是1号树改为0号,2号树改为1号。而移动j次后Bessy所站的树的新号码就是j mod 2,如果它与读入的掉苹果的树的编号相同,则苹果是从Bessy所站的树上掉下来的,否则是从另一棵树上掉下来的。
数学离散数学集合论 关系 代数系统 数理逻辑 图论
组合数学排列组合 母函数 群论 递推与递归 莫比乌斯反演
数学线性规划 动态 整数
高等数学向量 行列式与矩阵 微积分初步
概率统计
初等数论素数 整数理论 同余与模线性方程
计算几何
数据结构存储结构线性表
(一级结构)静态:数组 栈 队列 广义表 字符串
动态:指针链表 动态数组
树
(二级结构)表示法(静态、动态) 二叉树 森林
图
(三级结构)表示法(矩阵、邻接表、三元组)
特殊结构散列表(HASH表) 并查集 线段树 后缀树 哈夫曼树与哈夫曼编码 地址表Bit图 滚动数组 棋盘图 边顶置换图 二分点图(网络流)
常用方法遍历树 图 前/中/后序优先
转化拓扑排序(三级结构转一级结构) 最小生成树 最小树形图(三级结构转二级结构) 逆遍历
压缩路径树的线索化
压缩存储
查找线性直接 折半Fab
树形二叉查找树 平衡二叉树B+树B-树 线索二叉树索引表
排序插入排序直接排序、折半排序、2-路排序
交换排序冒泡排序 快速排序 归并排序
堆排序
基数排序链式基数排序 桶排序
代码素养代码的编写速度和准确性 误码率
算法实现
算法优化
调试 查错 测试
习惯变量名 注释 缩进 模块化
基本算法数学高精度计算(模拟计算)
表达式处理括号 前/中/后缀表达式 表达式树
排列组合求值 嵌套控制
高斯消元法
快速傅里叶变换(FFT)
筛选素数素数表
分数处理
基本操作实现大量数据赋值与移动Fillchar fillword move等函数
处理实数比较大小 高精度
字符串处理基本函数KMP算法
图论
(显示图搜索)路径问题
(边集)连通性测试传递闭包算法 极大强连通子图 最小点基
最短路问题标号法 第k小路 减半最短路Dijkstra算法floyd算法bellman-ford算法Warshall算法
特殊路径欧拉路及回路 哈密尔顿路及回路
图的中心和重心
生成树Kruskal算法Prim算法
集
(顶点集)覆盖集
独立集
支配集
割顶和块
网络流容量有上下界的网络最大/ 小流
容量有上下界的网络最小费用最大/ 小流
顶容量网络最大流
供求约束可行流
二分图匹配匈牙利算法
关键路径
搜索
(隐式图搜索)深度优先搜索
(回溯法)剪枝优化
预处理
记忆化搜索
可变下界的深度优先搜索
随机化搜索
广度优先搜索双向广搜多向广搜
启发式搜索(A算法)
分枝定界
多阶段决策贪心算法
背包动态规划
棋盘动态规划
划分动态规划
区间动态规划
树形动态规划
状态压缩型动态规划
其他构造法穷举
模拟
假设S是一百的数组 使用S[m mod 100]就可以了 这样在m递增的过程中s就可以滚动使用了
From zhouguyue
搭建双塔
描述 Description
2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr F曾亲眼目睹了这次灾难。为了纪念“911”事件,Mr F决定自己用水晶来搭建一座双塔。
Mr F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr F可以从这N块水晶中任取M(1≤M≤N)块来搭建。但是他不知道能否使两座塔有同样的高度,也不知道如果能搭建成一座双塔,这座双塔的最大高度是多少。所以他来请你帮忙。
给定水晶的数量N(1≤N≤100)和每块水晶的高度Hi(N块水晶高度的总和不超过2000),你的任务是判断Mr F能否用这些水晶搭建成一座双塔(两座塔有同样的高度),如果能,则输出所能搭建的双塔的最大高度,否则输出“Impossible”。
输入:
5
1 3 4 5 2
输出:
7
程序:
program mm;
var
a,sum:array[0103] of longint;
f:array[0103,02030] of longint;
i,j,k,l,m,n,x,y,z:longint;
function max(a,b,c:longint):longint;
begin
max:=a;
if b>max then max:=b;
if c>max then max:=c;
end;
begin
fillchar(a,sizeof(a),0);
fillchar(f,sizeof(f),$F0);
readln(n);
for i:=1 to n do
read(a[i]);
f[0,0]:=0;
for i:=1 to n do
sum[i]:=sum[i-1]+a[i];
for i:=1 to n do
for j:=0 to sum[n] do begin
if a[i]<=j
then f[i,j]:=max(f[i-1,j],f[i-1,j-a[i]],f[i-1,j+a[i]]+a[i])
else f[i,j]:=max(f[i-1,j],f[i-1,a[i]-j]+a[i]-j,f[i-1,j+a[i]]+a[i]);
end;
if f[n,0]>0
then writeln(f[n,0])
else writeln('Impossible');
end
以上就是关于接苹果(附程序)全部的内容,包括:接苹果(附程序)、oier的知识能力体系、关于pascal的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!