大家好!今天让小编来大家介绍下关于pscl教程(求树形动态规划的pscl教程..)的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。
文章目录列表:
输入: 5 部件 1 2 3 4 5 ai 3 5 8 7 10 bi 6 2 1 4 9 输出:341 5 4 2 3我有这个的EXE,样例: 输入: 7 4 2 2 0 1 0 4 2 1 7 1 7 6 2 2 输出: 13 解析: 这题比苹果树多了一个步骤就是把一棵普通树转化为二叉树,Sample Input 2 4 0 1 1 1 2 2 3 2 0 3 0 5 3 3 1 4 2 1 1 0 2 0 0 0 4 0 Sample Output 1 2 Source sgoi 分析:这题有2种做法,第2行是该技能在技能树中父技能的名称,下面是一颗有4个树枝的树 2 5 \ / 3 4 \ / 1 现在这颗树枝条太多了,对于如下图所示的树: 答案为1(只要一个士兵在结点1上),一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),每组测试数据第一行是一个整数n(1《=n《=20),表示所有不同技能的总数。
本文目录
求树形动态规划的pascal教程..
我最近也在研究这个,你可以从网上搜treedp,这里我给你传一份吧加分二叉树 【问题描述】 设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下: subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数 若某个子树为空,规定其加分为1,叶子的加分就是叶节点本身的分数。不考虑它的空子树。 试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。要求输出; (1)tree的最高加分 (2)tree的前序遍历 表示从节点i到节点j所组成的二叉树的最大加分,则动态方程可以表示如下: value} 题目还要求输出最大加分树的前序遍历序列,因此必须在计算过程中记下从节点i到节点j所组成的最大加分二叉树的根节点,用数组root表示 Ural 1018 二*苹果树 题目 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。 我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树 2 5 \ / 3 4 \ / 1 现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。 给定需要保留的树枝数量,求出最多能留住多少苹果。 输入格式 第1行2个数,N和Q(1《=Q《= N,1《N《=100)。 N表示树的结点数,Q表示要保留的树枝数量。接下来N-1行描述树枝的信息。 每行3个整数,前两个是它连接的结点的编号。第3个数是这根树枝上苹果的数量。 每根树枝上的苹果不超过30000个。 输出格式 一个数,最多能留住的苹果的数量。 解析:因为题目一给出就是二叉的,所以很容易就可以写出方程: a(I,j):=max(a(i.left,k)+a(i.right,j-k)),0《=k《=j 源程序代码: 由于比较简单便不给完全的代码了。 Function treedp(x,y:longint):longint; Var I,j,k:longint; Begin J:=0; For I:=0 to y do begin k:=treedp(b.r,y-I); if k》j then j:=k; end; treedp:=j; End; 选课 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有N门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程a是课程b的先修课即只有学完了课程a,才能学习课程b)。一个学生要从这些课程里选择M门课程学习,问他能获得的最大学分是多少? 输入: 第一行有两个整数N,M用空格隔开。(1《=N《=200,1《=M《=150) 接下来的N行,第I+1行包含两个整数ki和si, ki表示第I门课的直接先修课,si表示第I门课的学分。若ki=0表示没有直接先修课(1《=ki《=N, 1《=si《=20)。 输出: 只有一行,选M门课程的最大得分。 样例: 输入: 7 4 2 2 0 1 0 4 2 1 7 1 7 6 2 2 输出: 13 解析: 这题比苹果树多了一个步骤就是把一棵普通树转化为二叉树。 读入数据时把二叉树建好:第一个孩子作为父节点的左子树,其它孩子作为第一个孩子的右子树。 F(x,y):表示节点x取y门课得最高学分,则 F(x,y)=max(f(x.l,k-1)+x.v+f(x.r,y-k))k=0,1,..y f(x.l,k-1)+x.v(课程x的学分) :表示选了课程x,左孩子选k-1门课,共k门课。 f (x.r,y-k)表示右孩子只能选y-k门课。 标程中节点-1表示空节点,0是根节点,1—n是n门可选课程的节点. 思考:若本题加上选那些课程可得到这个最大学分,怎样修改程序? 实现: 怎么实现,是在竞赛中的很重要的一个问题,如果你想ac了这道题目的话,你应该熟悉怎么把一棵树转化成二叉树,完后怎么用递规的思想来实现动态规划。所以坚实的基础是很重要的东西,如果没有了基础,什么都是空中楼阁。 程序中已经边读边把二叉树建立好了。 源程序代码: program bluewater; type tree=record l,r,k:longint; end; var s:string; i,j,k,l:longint; n,m:longint; a:array of tree; b:array of integer; f:array of longint; procedure treedp(x,y:longint); var i,j,k,l:longint; begin if b》=0 then exit; treedp(a.r,y);{只有右子树的情况} j:=b; for k:=1 to y do{左右子树都有的情况} begin treedp(a.l,k-1); treedp(a.r,y-k); i:=b.k; if i》j then j:=i; end; b:=j; end; begin readln(s); assign(input,s);reset(input); readln(n,m); fillchar(f,sizeof(f),0); for i:=0 to n do begin a.k:=-1;end; {build tree} for i:=1 to n do begin readln(k,l); a.k:=l; if f.l:=i else a.r:=i; f:=i; end; {bianjie} for i:=-1 to n do for j:=-1 to m do if (i=-1) or (j=0) then b:=-1; {tree dp} treedp(a.l,m); {output} writeln(b); end. Tju1053 技能树 Problem 玩过Diablo的人对技能树一定是很熟悉的。一颗技能树的每个结点都是一项技能,要学会这项技能则需要耗费一定的技能点数。 只有学会了某一项技能以后,才能继续学习它的后继技能。每项技能又有着不同的级别,级别越高效果越好,而技能的升级也是 需要耗费技能点数的。 有个玩家积攒了一定的技能点数,他想尽可能地利用这些技能点数来达到最好的效果。因此他给所有的级别都打上了分,他认为 效果越好的分数也越高。现在他要你帮忙寻找一个分配技能点数的方案,使得分数总和最高。 Input 该题有多组测试数据。 每组测试数据第一行是一个整数n(1《=n《=20),表示所有不同技能的总数。 接下来依次给出n个不同技能的详细情况。 每个技能描述包括5行。 第一行是该技能的名称。 第2行是该技能在技能树中父技能的名称,名称为None则表示该技能不需要任何的先修技能便能学习。 第3行是一个整数L(1《=L《=20),表示这项技能所能拥有的最高级别。 第4行共有L个整数,其中第I个整数表示从地I-1级升到第I级所需要的技能点数(0级表示没有学习过)。 第5行包括L个整数,其中第I个整数表示从第I-1级升级到第I级的效果评分,分数不超过20。 在技能描述之后,共有两行,第1行是一个整数P,表示目前所拥有的技能点数。 接下来1行是N个整数,依次表示角色当前习得的技能级别,0表示还未学习。这里不会出现非法情况。 Output 每组测试数据只需输出最佳分配方案所得的分数总和。 解析:这题是选课的加强版,但并难不倒我们 还是把一棵树转换为二叉树,完后从子节点到根节点作一次dp,最后得到最优解 由于和上题很相像就不写方程了。 源代码程序: program bluewater; type tree=record s,sf:string; l,r,m:longint; c:array of longint; d:array of longint; end; var i,j,k,l,m,n:longint; a:array of tree; b:array of longint; learn:array of longint; f:array of longint; function treedp(x,y:longint):longint; var i,j,k,l,max,o,p,q:longint; begin if f;exit;end; max:=treedp(a.r,y); {learn》0} if learn》0 then begin for k:=0 to y do begin i:=treedp(a.r,y-k); if i》max then max:=i; end; end; {learn=0} l:=0;p:=0;i:=0; for o:=1 to a.m do begin if o》learn then begin l:=l+a;end; for k:=0 to y-l do begin i:=treedp(a.r,y-l-k)+p; if i》max then max:=i; end; end; f:=max; treedp:=max; end; function find(x:string):longint; var i,j:longint; begin for i:=0 to n do if a.s=x then break; find:=i; end; begin while not(eof(input)) do begin {input} readln(n); fillchar(a,sizeof(a),0); fillchar(b,sizeof(b),0); a.s:=’None’; for i:=1 to n do with a do begin readln(s); readln(sf); readln(m); for j:=1 to m do read(c);readln; for j:=1 to m do read(d);readln; end; readln(m); if m》8000 then m:=8000; for i:=1 to n do read(learn);readln; {build binary tree} for i:=1 to n do begin k:=find(a.sf); if b=0 then begin b.l:=i;end else begin a:=i;end; end; {bian jie} for i:=0 to 20 do for j:=0 to 8000 do f:=-1; for i:=0 to 8000 do f:=0; {main} writeln(treedp(a.l,m)); end; end. 战略游戏 Problem Bob喜欢玩电脑游戏,特别是战略游戏。但是他经常无法找到快速玩过游戏的办法。现在他有个问题。 他要建立一个古城堡,城堡中的路形成一棵树。他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能了望到所有的路。 注意,某个士兵在一个结点上时,与该结点相连的所有边将都可以被了望到。 请你编一程序,给定一树,帮Bob计算出他需要放置最少的士兵. Input 第一行为一整数M,表示有M组测试数据 每组测试数据表示一棵树,描述如下: 第一行 N,表示树中结点的数目。 第二行至第N+1行,每行描述每个结点信息,依次为:该结点标号i,k(后面有k条边与结点I相连)。 接下来k个数,分别是每条边的另一个结点标号r1,r2,...,rk。 对于一个n(0《n《=1500)个结点的树,结点标号在0到n-1之间,在输入数据中每条边只出现一次。 Output 输出文件仅包含一个数,为所求的最少的士兵数目。 例如,对于如下图所示的树: 答案为1(只要一个士兵在结点1上)。 Sample Input 2 4 0 1 1 1 2 2 3 2 0 3 0 5 3 3 1 4 2 1 1 0 2 0 0 0 4 0 Sample Output 1 2 Source sgoi 分析:这题有2种做法,一种是比较简单但不是很严密的贪心,如果测试数据比较刁钻的话就不可能ac,而这题是一道比较典型的树型动态规划的题目,这题不但要考虑子节点对他的根节点的影响,而且每放一个士兵,士兵所在位置既影响他的子节点也影响了他的根节点。不过状态还是很容易来表示的,动规实现也不是很难,不过这在这些例题中也有了些“创新”了。而且这题不是一个对二叉树的dp,而是对一颗普通树的dp,所以更具代表性。 源程序代码: program bluewater; const maxn=1500; var i,j,k,l:longint; m,n,p,q:longint; a:array of boolean; b:array of longint; c:array of boolean; function leaf(x:longint):boolean; var i,j:longint; t:boolean; begin t:=true; for i:=0 to n-1 do if a then begin t:=false;break;end; leaf:=t; end; function treedp(x:longint):longint; var i,j,k,l:longint; begin j:=0;{add} k:=0;{leaf} l:=0;{not put not leaf} for i:=0 to n-1 do if (a) and (x《》i) then if leaf(i) then inc(k) else begin j:=j+treedp(i); if not(c) then inc(l); end; {puanduan} if (k》0) or (l》0) then begin c:=true;treedp:=j+1;exit;end; if (j》0) and (l=0) then begin treedp:=j;exit;end; end; begin {input} readln(m); for p:=1 to m do begin fillchar(b,sizeof(b),0); fillchar(a,sizeof(a),false); fillchar(c,sizeof(c),false); readln(n); for i:=1 to n do begin read(k,l); for j:=1 to l do begin read(q); a:=true; b:=1; end; readln; end; {main} for i:=0 to n-1 do if b=0 then break; fillchar(b,sizeof(b),0); if leaf(i) then writeln(’1’) else writeln(treedp(i)); end; end. Ura .
pascal排列组合教程
排列与组合3.1加法原理与乘法原理1.加法原理:做一件事情,完成它可以有n类办法,在第一类办法中有m1 种不同的方法,在第二类办法中有 m2种不同的方法,……,在第n类办法中有 mn种不同的方法。那么完成这件事共有 N= m1+m2+...+mn 种不同的方法。2.乘法原理: 做一件事情,完成它需要分成n个步骤,做第一步有m1 种不同的方法,做第二步有 m2种不同的方法,……,做第n步有 种mn不同的方法,那么完成这件事有 N=m1*m2*...*mn 种不同的方法。 3.两个原理的区别:一个与分类有关,一个与分步有关;加法原理是“分类完成”,乘法原理是“分步完成”。 练习:1.由数字1,2,3,4,5可以组成多少个三位数(各位上的数字允许重复)? ② 2.由数字0、1,2,3,4,5可以组成多少个三位数(各位上的数字允许重复)? ③ 3.由数字0,1,2,3,4,5可以组成多少个十位数字大于个位数字的两位数? 例 4. 一个三位密码锁,各位上数字由0,1,2,3,4,5,6,7,8,9十个数字组成,可以设置多少种三位数的密码(各位上的数字允许重复)?首位数字不为0的密码数是多少种?首位数字是0的密码数又是多少种? 5.如图,要给地图A、B、C、D四个区域分别涂上3种不同颜色中的某一种,允许同一种颜色使用多次,但相邻区域必须涂不同的颜色,不同的涂色方案有多少种? 6.某班有22名女生,23名男生. ① 选一位学生代表班级去领奖,有几种不同选法? ② 选出男学生与女学生各一名去参加智力竞赛,有几种不同的选法? 7.105有多少个约数?并将这些约数写出来. 8.从5幅不同的国画、2幅不同的油画、7幅不同的水彩画中选不同画种的两幅画布置房间,有几种选法? 9.若x、y可以取1,2,3,4,5中的任一个,则点(x,y)的不同个数有多少? 10.一个口袋内装有5个小球另一个口袋内装有4个小球,所有这些小球的颜色各不相同① 从两个口袋内任取一个小球,有 种不同的取法; 11.从两个口袋内各取一个小球,有 种不同的取法. 12.乘积(a1+a2+a3)(b1+b2+b3+b4)(c1+c2+c3+c4+c5)展开共有 个项。 13.有四位考生安排在5个考场参加考试.有 种不同的安排方法。 (答案:125;180;15;1000,900,100;6;45,506;8;59;25;9;20;60;625)3. 2 排列与组合的概念与计算公式1.排列及计算公式从n个不同元素中,任取m(m≤n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 p(n,m)表示.p(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)!(规定0!=1).2.组合及计算公式 从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数.用符号c(n,m) 表示.c(n,m)=p(n,m)/m!=n!/((n-m)!*m!);c(n,m)=c(n,n-m);3.其他排列与组合公式从n个元素中取出r个元素的循环排列数=p(n,r)/r=n!/r(n-r)!.n个元素被分成k类,每类的个数分别是n1,n2,...nk这n个元素的全排列数为n!/(n1!*n2!*...*nk!).k类元素,每类的个数无限,从中取出m个元素的组合数为c(m+k-1,m).练习: 1.(1)用0,1,2,3,4组合多少无重复数字的四位数?(96) (2)这四位数中能被4整除的数有多少个?(30) (3)这四位数中能被3整除的数有多少个?(36) 2.用0,1,2,3,4五个数字组成无重复数字的五位数从小到大依次排列. (1) 第49个数是多少?(30124) (2) 23140是第几个数?(40) 3.求下列不同的排法种数:(1) 6男2女排成一排,2女相邻;(p(7,7)*p(2,2))(2) 6男2女排成一排,2女不能相邻;(p(6,6)*p(7,2))(3) 5男3女排成一排,3女都不能相邻;(p(5.5)*p(6,3))(4) 4男4女排成一排,同性者相邻;(p(4,4)*p(4,4)*p(2,2))(5) 4男4女排成一排,同性者不能相邻。(p(4,4)*p(4,4)*p(2,2)) 4.有四位医生、六位护士、五所学校。(1) 若要选派三位医生到五所学校之中的三所学校举办健康教育讲座,每所学校去一位医生有多少种不同的选派方法?(c(5,3)*p(4,3))(2) 在医生或护士中任选五人,派到五所学校进行健康情况调查,每校去且仅去一人,有多少种不同的选派方法?(p(10,5))(3) 组成三个体检小组,每组一名医生、两名护士,到五所学校中的三所学校为老师体检,有多少种不同的选派方法?(c(5,3)*p(4,3)*c(6,2)*c(4,2)*c(2,2))5.平面上有三条平行直线,每条直线上分别有7,5,6个点,且不同直线上三个点都不在同一条直线上。问用这些点为顶点,能组成多少个不同四边形?(2250) 6.平面上有三条平行直线,每条直线上分别有7,5,6个点,且不同直线上三个点都不在同一条直线上。问用这些点为顶点,能组成多少个不同三角形?(751) 7.将N个红球和M个黄球排成一行。例如:N=2,M=2可得到以下6种排法: 红红黄黄 红黄红黄 红黄黄红 黄红红黄 黄红黄红 黄黄红红 问题:当N=4,M=3时有多少种不同排法?(不用列出每种排法)(35)8.用20个不同颜色的念珠穿成一条项链,能做多少个不同的项链.(20!/20)9.在单词MISSISSIPPI 中字母的排列数是(11!/(1!*4!*4!*2!)10.求取自1,2,...k的长为r的非减序列的个数为(c(r+k-1,r)) 3.3排列与组合的产生算法1.排列的产生方法1:(递归,深度优先产生)程序如下:program pailei;const m=4;var a:array of integer ; b:array of boolean;procedure print;var i:integer;begin for i:=1 to m do write(a); writeln;end;procedure try(dep:integer);var i:integer;begin for i:=1 to m do if b then begin a:=false; if dep=m then print else try(dep+1); b:=true; end;end;beginfillchar(b,sizeof(b),true);try(1);end.方法2.根据上一个排列产生下一个排列.程序如下:program pailei;const m=5;var a:array of integer ;i,j,temp,k,l:integer;procedure print;var i:integer;begin for i:=1 to m do write(a); writeln;end;beginfor i:=1 to m do a:=i;repeat print; i:=m-1; while (i》0) and (a) do i:=i-1; if i》0 then begin j:=m; while a do j:=j-1; temp:=a:=temp; k:=i+1;l:=m; while k《l do begin temp:=a:=temp; k:=k+1;l:=l-1 end; end;until i=0;end.2.组合的产生算法算法1:(递归,深度优先产生)程序如下:program zuhe;const n=6;m=4;var a:array of integer; i,j:integer;procedure print;var i:integer;begin for i:=1 to m do write(a); writeln;end;procedure try(dep:integer);var i:integer;begin for i:=a+1 to n-(m-dep) do begin a:=i; if dep=m then print else try(dep+1); endend;begina:=0;try(1);end.算法2:根据前一个组合产生下一个组合程序如下:program zuhe;const n=6;m=4;var a:array of integer; i,j:integer;procedure print;var i:integer;begin for i:=1 to m do write(a); writeln;end;begin for i:=1 to m do a:=i; repeat print; i:=m; while (i》0) and (a=n-(m-i)) do dec(i); if i》0 then begin a+1; for j:=i+1 to m do a+1; end; until i=0;end.练习:1.已知n(1《=n《=20)个整数x1,x2,…,xn(1《=xi《=5000000),以及一个整数k(k《n)。从n个整数中任选k个整数相加,可分别得到一系列的和。现在,要求你计算出和为素数共有多少种。2.n个部件,每个部件必须经过先A后B两道工序。 以知部件i在A,B 机器上的时间分别为ai,bi。如何安排加工顺序,总加工时间最短? 输入: 5 部件 1 2 3 4 5 ai 3 5 8 7 10 bi 6 2 1 4 9 输出:341 5 4 2 3我有这个的EXE,讲的东西也还行,这个只是其中的一章,你要要把邮箱留下
pascal教程
第一节 Pascal语言的特点 信息学奥林匹克竞赛是一项益智性的竞赛活动,核心是考查参赛选手的智力和使用计算机编程解题的能力。信息学奥林匹克竞赛要求参赛选手有如下能力:针对竞赛题目中的要求构建数学模型,构造出有效的算法和选用相应的数据结构,写出高级语言程序,上机调试通过。程序设计是信息学奥林匹克竞赛的基本功,因此,青少年参与竞赛活动的第一步是必须掌握一门高级语言及其程序设计方法。以纪念法国数学家而命名的Pascal语言是使用最广泛的计算机高级语言之一,被国际上公认为程序设计教学语言的典范。其主要特点有:严格的结构化形式;丰富完备的数据类型;运行效率高;查错能力强。正因为这些特点,Pascal语言可以被方便地用于描述各种数据结构和算法,编写出高质量的程序。尤其是对于青少年程序设计初学者,Pascal语言有利于顺利入门,有益于从一开始培养良好的程序设计风格和习惯,越来越多的各类学校都把Pascal语言作为程序设计教学的第一语言。IOI(国际奥林匹克信息学竞赛)把Pascal语言规定为二种程序设计语言之一,NOI(全国信息学奥林匹克竞赛)把Pascal语言定为唯一提倡的程序设计语言,NOIp(全国信息学奥林匹克联赛)把Pascal定为最主要的程序设计语言。 Pascal语言有多种版本,本教材采用的Turbo Pascal 7.0(或Borland Pacsal 7.0) 是目前PC机上使用最多的一种高效Pascal,是迄今为止DOS环境下的最高版本。Turbo Pascal 7.0 所需硬件环境是任意型号的PC机,并且仅需一台1.44M软盘驱动器(当然有其他条件更好);最小软件系统包括Turbo.exe(集成环境)和Turbo.tpl(标准单元库)两个文件,如果包括Turbo.hlp(求助文件)则更有利于学习。Turbo Pascal 7.0可以工作在DOS操作系统或Windows操作系统环境下。
以上就是小编对于pscl教程(求树形动态规划的pscl教程..)问题和相关问题的解答了,pscl教程(求树形动态规划的pscl教程..)的问题希望对你有用!