NOIP2008提高组复赛试题及题解
NOIP2008信息奥赛提高组试题与答案

NOIP2008信息奥赛提高组试题与答案(Pascal语言)第14届信息学奥赛试题单项选择1. 在以下各项中,()不是操作系统软件。
A.Solaris B.Linux C.Sybase D.Windows Vista E.Symbian2. 微型计算机中,控制器的基本功能是()。
A. 控制机器的各个部件协调工作B.实现算数运算与逻辑运算C.存储各种控制信息D. 获取外部信息E.存放程序和数据3. 设字符串S=“Olympic”,S的非空字串的数目是()。
A.29B.28C.16D.17E.74. 完全2叉树有2*N-1的结点,则它的叶子结点数目是()。
A.N-1B.2*NC.ND.2^N-1E.N/25. 将数组{8,23,4,16,77,-5,53,100}中元素从大到小按顺序排序,每次可以交换任意两个元素,最少要交换()次。
A.4B.5C.6D.7E.86.设栈S的初始状态为空,元素a,b,c,d,e,f依次入栈,出栈顺序为b,d,c,f,e,a那么栈容量至少该是()A.6B.5C.4D.3E.27.与十进制数28.5625相等的四进制数是()A.123.21B.131.22C.130.22D.130.21E.130.208.递归过程和函数调用时,处理参数和返回地址,通常使用一种称为()的数据结构。
A.队列B.多维数组C.线性表D.链表E.栈9.TCP/IP 是一组构成互联网基础的网络协议,字面上包括两组协议:传输控制协议(TCP)和网际互联协议(IP)。
TCP/IP协议把Internet网络系统描述成具有4个层次功能的网络模型,其中提供源节点和目的节点之间的信息传输服务,包括寻址和路由器选择等功能的是()。
A.链路层B.网络层C.传输层D.应用层E.会话层10.对有序数组{5,13,19,21,37,56,64,75,88,92,100}进行二分查找,等概率情况下,查找成功的平均查找长度(平均比较次数)是()。
NOIP2008提高组复赛题解-文档资料

思路: 枚举两加数,计算所需火柴棒是否等于n。枚举 范围0~1000。 总结: 这也是比较水的一道题,数据规模较小,算法 简单,比赛中clude <fstream> #define I_F "matches.in" #define O_F "matches.out" #define MAX 1000 using namespace std; const short match[10]={6,2,5,5,4,5, 6,3,7,6}; //10个数字所需火柴棒
思路:
统计单词中每个字母的出现次数,挑出最多的次数和 最少的次数(不包括0次),相减判断是否为质数即可。 判断质数时可以写函数判断,也可以把100以内的质数 列成常量数组直接判断,因为单词最多只有100个字母。 需要注意的是输出时的LWNA四个字母要大写。 * 总结: 这是一道送分题,没有什么难度,需要注意的细节也 不多,所以在比赛中是一定要拿满分的。
long ans; short n;
void Input(); int Matches(int x); void Search(); void Output(); int main() { Input(); Search(); Output(); } void Input() { ifstream fin(I_F); fin>>n; fin.close(); }
输入格式: 输入文件matches.in共一行,有一个整数n(n<=24)。 * 输出格式: 输出文件matches.out共一行,表示能拼成的不同等 式的数目。
样例1 输入:
14 输出: 2 解释: 2个等式为0+1=1和1+0=1。
1995-2008复赛试题及解析

NOIP1995年复赛试题1. 设有下列的算式:求出□中的数字,并打印出完整的算式来。
8 0 9 ------------- □□) □□□□ □□------------- □□□ □□□ ------------- 12. 方阵填数:在一个N ⨯N 的方阵中,填入1,2,……N ⨯N 个数,并要求构成如下的格式: 例:3. 若将一个正整数化为二进制数,在此二进制数中,我们将数字1的个数多于数字0的个数的这类二进制数称为A 类数,否则就称其为B 类数。
例如:(13)10=(1101)2 其中1的个数为3,0的个数为1,则称此数为A 类数; (10)10=(1010)2 其中1的个数为2,0的个数也为2,称此数为B 类数; (24)10=(11000)2 其中1的个数为2,0的个数为3,则称此数为B 类数; 程序要求:求出1~1000之中(包括1与1000),全部A 、B 两类数的个数。
4.编码问题:设有一个数组A:ARRAY[0..N-1] OF INTEGER ;数组中存放的元素为0~N-1之间的整数,且A[i]≠A[j](当i ≠j 时)。
例如:N=6时,有: A=(4,3,0,5,1,2) 此时,数组A 的编码定义如下: A[0]的编码为0;A[i]的编码为:在A[0],A[1],……A[i-1]中比A[i]的值小的个数(i=1,2……N-1) ∴上面数组A 的编码为:B=(0,0,0,3,1,2)程序要求解决以下问题:给出数组A 后,求出其编码;给出数组A 的编码后,求出A 中的原数据。
5. 灯的排列问题:设在一排上有N 个格子(N ≤20),若在格子中放置有不同颜色的灯,每种灯的个数记为N 1,N 2,……N k (k 表示不同颜色灯的个数)。
放灯时要遵守下列规则:同一种颜色的灯不能分开;不同颜色的灯之间至少要有一个空位置。
例如:N=8(格子数) R=2(红灯数) B=3(蓝灯数) 放置的方法有:N=513 14 15 16 1 12 23 24 17 2 11 22 25 18 3 10 21 20 19 4 9 8 7 6 5N=616 17 18 19 20 1 153****221214 29 36 33 22 3 132****423412 27 26 25 24 5 11 10 9 8 7 6B-R 顺序放置的总数为12种。
1995-2008 历届NOIP试题及详解

N=6
正整数化为二进制数,在此二进制数中,我们将数字 16 17 18 19 20 1
1
于数字
0
的个数的这类二进制数称为 15 30 31 32 21 2
A
类数,否则就称
数。
14 29 36 33 22 3
(13)10=1(3 1218013)5 234 23 4
的个数为132,207 的26个2数5 为241,5则称此数为 A 类数;
提示:文档已分节,可用 word 跳转节功能 本文为本人将 1995-2008 年历届 NOIP 试题、研究成果整理而成,由于“年代久远”所以有不少 资料没有找到。但本人都尽量整理最有价值的信息记录于此。 资料来源皆为网络,若引用请注明出处 一不注意就 208 页了呢~ 其实最初只是想方便自己,看着一下午的成果,就忍不住放到了网络 上。由于赶时间,质量不太好,而且历届 NOIP 的排版也不一样,只是做了粗略的整理、排 版,若有错误之处,敬请谅解。 回首历届 NOIP,甚至比我自己出生的还早的老题,一代代 OIer 就从这条路上走过,作为一个 不大努力的 OIer,我甚至为自己感到愧疚。总之,为了报答一代代出题人、教师、主办方以及 OIer 们,在努力一把也不迟啊。
96
109
108
1 <2> 本题 18 分(4%+6%+8%)
① 输入 N=1 (4%) 结果:
② 输入 N=3 (6%) 结果:
1
781
692
543 ③ 输入 N=10(8%)
结果: 28 29 30 31 32 33 34 35 36 1
27 58 59 60 61 62 63 64 37 2
26 57 80 81 82 83 84 65 38 3
NOIP2008提高组复赛模拟试题

全国青少年信息学奥林匹克联赛复赛模拟试题湖南省长沙市第一中学周祖松1.无限序列(infinit.pas/c/cpp)【问题描述】我们按以下方式产生序列:1、开始时序列是: "1" ;2、每一次变化把序列中的 "1" 变成 "10" ,"0" 变成 "1"。
经过无限次变化,我们得到序列"1011010110110101101..."。
总共有 Q 个询问,每次询问为:在区间A和B之间有多少个1。
任务写一个程序回答Q个询问输入第一行为一个整数Q,后面有Q行,每行两个数用空格隔开的整数a, b。
输出共Q行,每行一个回答约定∙ 1 <= Q <= 5000∙ 1 <= a <= b < 263样例分析:我们先看看序列变化规律,S1 = "1", S2 = "10", S3 = "101", S4 = "10110", S5 = "10110101", 等等. Si 是 S(i+1)的前缀。
序列Si 是由序列 S(i-1)和 S(i-2), 连接而成的。
即Si = Si-1 + Si-2 (实际上上是Fibonacci数列)。
找到规律以后,我们可以可以用递归的方法求出从从位置1到位置X之间所有的1的个数,用一个函数F计算,结果为f(b)-f(a-1)。
时间复杂度为: O(Q * log MAX_VAL)此题需要先找出数学规律,再进用递归实现。
主要考查选手的数学思维能力和递归程序的实现。
源程序:constnn=92; //进行92次的数列扩展后,数列长度就会超过给定的数据范围,varf,ft:array[0..nn] of int64;q,i,j,l1,l2:longint;a,b:qword;procedure prapre;{预处理}var i:longint;beginf[0]:=1;f[1]:=1;ft[0]:=0;ft[1]:=1;for i:=2 to nn dobeginf[i]:=f[i-1]+f[i-2];ft[i]:=ft[i-1]+ft[i-2];end;end;function find(a:int64;ll:longint):int64;{求这个数列的前a个有多少个1}beginif a=0 then exit(0);find:=0;if a=f[ll] then find:=ft[ll] elseif a<=f[ll-1] then find:=find(a,ll-1)else find:=ft[ll-1]+find(a-f[ll-1],ll-2);end;beginassign(input,'infinit.in');reset(input);assign(output,'infinit.out');rewrite(output);prapre;readln(q);for i:=1 to q dobeginreadln(a,b);writeln(find(b,nn)-find(a-1,nn));end;close(input);close(output);end.2.删数(remove.pas/c/cpp)【问题描述】有N个不同的正整数数x1, x2, ... x N排成一排,我们可以从左边或右边去掉连续的i个数(只能从两边删除数),1<=i<=n,剩下N-i个数,再把剩下的数按以上操作处理,直到所有的数都被删除为止。
【noip2008年提高组题二】火柴棒等式

【noip2008年提高组题二】火柴棒等式问题描述:在火柴棒等式中,每个数字由若干火柴棒组成,要求组成一个等式。
等式中有加号、等号和两个数字,它们之间各自由若干火柴棒连接起来。
若干数字的顺序和下标之和相等,则等式成立。
已知通过7根火柴棒可以得到的合法的等式有12个,求合法的所有等式。
解题思路:本题为全排列问题的一个典型应用。
根据题目给出的火柴棒等式的要求,遍历所有的7根火柴棒的全排列,验证是否能组成合法的火柴棒等式,并将符合条件的等式输出即可。
以下为详细步骤:1. 构建火柴棒数量列表,用于表示每个数字所需的火柴棒数量。
列表的下标表示数字,列表的值表示火柴棒数量;2. 生成7根火柴棒的全排列,并将每一个排列结果作为一个可能的等式;3. 遍历所有可能的等式,判断是否符合题目要求:等式中有加号、等号和两个数字,它们之间各自由若干火柴棒连接起来。
若干数字的顺序和下标之和相等,则等式成立;4. 将符合条件的等式输出。
以下为Python代码实现:def dfs(total, cur):if cur == 7:judge(total)returnfor i in range(10):if num[i] > 0:num[i] -= 1dfs(total + ch[cur][i], cur + 1)num[i] += 1def judge(total):for i in range(10):if num[i] != 0:returna, b, c = total[0], total[1], total[2]if a + b == c and a <= b:res.append(total)ch = [[6, 2, 5, 5, 4, 5, 6, 3, 7, 6] for _ in range(7)]num = [2, 5, 5, 4, 5, 6, 3, 7, 6, 6]res = []dfs([], 0)for i in range(len(res)):print(f'{res[i][0]} + {res[i][1]} = {res[i][2]}')在上述代码中,ch为火柴棒数量列表,num为每个数字所需的火柴棒数量。
2008年noip提高组复赛题解

2015/11/25
北京12中庄燕文
【题目类型】双线程动态规划 【建议编程时间】40分钟。这里的编程时间包括调试时间。 【空间复杂度】约27M,全局变量完全可承受。50*50*50*50*sizeof(int)=2.5*10^7. 【解题分析】 1、 读入矩阵,注意行列。 2、 采用一个四维数组记录当前两条路走到的位置(i1,j1,i2,j2)时取得的最大值,初始化为 0,表示不可能到达。(0,0,0,0)为1,最后减1输出。 3、 一个四重循环枚举两条路分别走到的位置。由于每个点均从上或左继承而来,故内部 有四个if,分别表示两个点从上上、上左、左上、左左继承来时,加上当前两个点所取得 的最大值。例如,f[i][j][k][l] = max{f[i][j][k][l], f[i-1][j][k-1][l] + a[i][j] + a[k][l]},表示两点均从 上面位置走来。 4、 输出右下角处的最大值f[m][n][m][n],注意换行。 【编程注意】 1、 在数组边界处特殊处理,避免数组越界。 2、 若待继承的点最大值为零,则停止判断,不能从这里走来。 3、 显然,非矩阵右下角的汇合点,两个位置不能重合(否则路径相交),若重合则最大 值为0,不可达。
2015/11/25
北京12中庄燕文
这道题的错误做法很多,错误做法却能得满分的也很多, 这里就不多说了.直接切入正题,就是即将介绍的这个基 于二分图的算法. 注意到并没有说基于二分 图匹配,因为这个算法和二分图匹配无关.这个算法只是 用到了给一个图着色成二分图. 第一步需要解决的问题是,判断是否有解. 考虑对于任意两个数q1[i]和q1[j]来说,它们不能压入同 一个栈中的充要条件是什么(注意没有必要使它们同时 存在于同一个栈中,只是压入了同一个栈).实际上,这个 条件p是:存在一个k,使得i<j<k且q1[k]<q1[i]<q1[j].
noip2008普及组复赛试题(附题解)

全国信息学奥林匹克联赛(NOIP2008)复赛普及组注意事项:1、文件名(程序名和输入输出文件名)必须使用小写。
2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。
3、全国统一评测时采用的机器配置为:CPU 1.9GHz,内存512M,上述时限以此配置为准。
各省在自测时可根据具体配置调整时限。
1.ISBN号码(isbn.pas/c/cpp)【问题描述】每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。
ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。
识别码的计算方法如下:首位数字乘以1加上次位数字乘以2......以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。
例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2, (9)再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。
【输入】输入文件isbn.in只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
【输出】输出文件isbn.out共一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
全国信息学奥林匹克联赛(NOIP2008)复赛提高组一、题目概览二、提交源程序文件名三、编译命令(不包含任何优化开关)四、运行内存限制注意事项:1. 文件名(程序名和输入输出文件名)必须使用大写。
2. C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。
3. 全国统一评测时采用的机器配置为:CPU 1.9GHz,内存512M,上述时限以此配置为准。
各省在自测时可根据具体配置调整时限。
1. 笨小猴(word.pas/c/cpp)【问题描述】笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。
但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn 是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案。
【输入】输入文件word.in只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100。
【输出】输出文件word.out共两行,第一行是一个字符串,假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”;第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出0。
【输入输出样例1】【输入输出样例1解释】单词error中出现最多的字母r出现了3次,出现次数最少的字母出现了1次,3-1=2,2是质数。
【输入输出样例2】【输入输出样例2解释】单词olympic中出现最多的字母i出现了2次,出现次数最少的字母出现了1次,2-1=1,1不是质数。
基本的字符串处理,细心一点应该没问题的,不过判断素数时似乎需要考虑下0和1的情况。
var a:array['a'..'z']of integer;s:string;l,i,max,min,n:integer;ch:char;flag:boolean;beginassign(input,'word.in');reset(input);assign(output,'word.out');rewrite(output);readln(s);l:=length(s);fillchar(a,sizeof(a),0);for i:=1 to l doinc(a[s[i]]);max:=0;min:=100;for ch:='a'to 'z' doif a[ch]>0 then beginif a[ch]>max then max:=a[ch];if a[ch]<min then min:=a[ch];end;n:=max-min; flag:=true;if(n=0) or (n=1) then flag:=falseelsefor i:=2 to trunc(sqrt(n)) doif n mod i =0 then begin flag:=false;break;end;if flag then begin writeln('Lucky Word'); writeln(n);endelse begin writeln('No Answer');writeln(0);end;close(output);close(input);end.2. 火柴棒等式(matches.pas/c/cpp)【问题描述】给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。
用火柴棍拼数字0-9的拼法如图所示:注意:1. 加号与等号各自需要两根火柴棍2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)3. n根火柴棍必须全部用上【输入】输入文件matches.in共一行,又一个整数n(n<=24)。
【输出】输出文件matches.out共一行,表示能拼成的不同等式的数目。
【输入输出样例1】【输入输出样例1解释】2个等式为0+1=1和1+0=1。
【输入输出样例2】【输入输出样例2解释】9个等式为:0+4=40+11=111+10=112+2=42+7=94+0=47+2=910+1=1111+0=11预处理下,然后枚举、剪枝,范围稍微开大点,弄到2000似乎足够了,剪枝后不会超时的。
首先预处理下每个数(0~2000)需要多少个火柴棒,然后枚举A和B,再判断。
参考程序1:program matches;constinp='matches.in';oup='matches.out';num:array['0'..'9'] of integer=(6,2,5,5,4,5,6,3,7,6);//0~9需要的火柴棒数maxn=1000;varf:array[0..maxn*2] of longint;i,j,k,n,ans:longint;s:string;procedure flink;beginassign(input,inp);reset(input);assign(output,oup);rewrite(output);end;procedure fclose;beginclose(input);close(output);end;procedure init;//预处理0~2000每个数需要的火柴棒数vari,j,k:longint;s:string;beginfor i:= 0 to maxn*2 dobeginstr(i,s);f[i]:=0;for j:= 1 to length(s) doinc(f[i],num[s[j]]);end;end;beginflink;readln(n);init;ans:=0;n:=n-4;//总火柴棒数减去'+'和'='所需的火柴棒数for i:= 0 to maxn do//枚举Abeginif f[i]>=n then continue;//剪枝for j:= 0 to maxn do//枚举Bbeginif f[i]+f[j]>=n then continue;//剪枝k:=i+j;if f[i]+f[j]+f[k]=n then inc(ans);//符合条件,总数加一end;end;write(ans);fclose;end.参考程序2:program matches;var n:longint;beginassign(input,'matches.in');reset(input);assign(output,'matches.out');rewrite(output);read(n);n:=n-4;if n<9 thenbeginwriteln(0);close(output);exit;end;case n of9:writeln(1);10:writeln(2);11:writeln(8);12:writeln(9);13:writeln(6);14:writeln(9);15:writeln(29);16:writeln(39);17:writeln(38);18:writeln(65);19:writeln(88);20:writeln(128);end;close(output);end.3. 传纸条(massage.pas/c/cpp)【问题描述】小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。
一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。
幸运的是,他们可以通过传纸条来进行交流。
纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n)。
从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递。
在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。
班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙。
反之亦然。
还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低(注意:小渊和小轩的好心程度没有定义,输入时用0表示),可以用一个0-100的自然数来表示,数越大表示越好心。
小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径,使得这两条路径上同学的好心程度只和最大。
现在,请你帮助小渊和小轩找到这样的两条路径。
【输入】输入文件message.in的第一行有2个用空格隔开的整数m和n,表示班里有m行n列(1<=m,n<=50)。
接下来的m行是一个m*n的矩阵,矩阵中第i行j列的整数表示坐在第i行j列的学生的好心程度。
每行的n个整数之间用空格隔开。
【输出】输出文件message.out共一行,包含一个整数,表示来回两条路上参与传递纸条的学生的好心程度之和的最大值。
【输入输出样例】【限制】30%的数据满足:1<=m,n<=10100%的数据满足:1<=m,n<=50这道题和方格取数是一样的,只是状态的给出不同而已,典型的动态规划,我们可以把一来一回变成2次同时从左上到右下的过程,用f(i1,j1,i2,j2)表示两个同时分别到达(i1,j1)(i2,j2)的最大值,则转移方程为:设x=max(f【i1-1,j1,i2-1,j2】,f【i1-1,j1,i2,j2-1】,f【i1,j1-1,i2-1,j2】,f【i1,j1-1,i2,j2-1】)f【i1,j1,i2,j2】={ 0 i1=0或j1=0或i2=0 或j2=0{ x+a【i1,j1】i1*i2*j1*j2<>0 且i1=i2,j1=j2{ x+a【i1,j1】+a【i2,j2】 i1*i2*j1*j2<>0 且i1<>i2,j1<>j2代码如下:program message;varf:array[0..51,0..51,0..51,0..51]of longint;map:array[0..100,0..100]of longint;n,m:longint;procedure init ;beginassign(input,'message.in');assign(output,'message.out');reset(input);rewrite(output);end;procedure prepare;vari,j:longint;beginreadln(n,m);for i:=1 to n dofor j:=1 to m dobeginread(map[i,j]);end;end;procedure outit;beginclose(input) ;close(output);end;procedure main;vari,j,k,l:longint;beginfor i:=1 to n dofor j:=1 to m dofor k:=1 to n dofor l:=1 to m dobeginif f[i-1,j,k-1,l]>f[i,j,k,l] thenf[i,j,k,l]:=f[i-1,j,k-1,l];if f[i-1,j,k,l-1]>f[i,j,k,l] thenf[i,j,k,l]:=f[i-1,j,k,l-1];if f[i,j-1,k-1,l]>f[i,j,k,l] thenf[i,j,k,l]:=f[i,j-1,k-1,l];if f[i,j-1,k,l-1]>f[i,j,k,l] thenf[i,j,k,l]:=f[i,j-1,k,l-1];f[i,j,k,l]:=f[i,j,k,l]+map[i,j];if (i<>k)and(j<>l) then f[i,j,k,l]:=f[i,j,k,l]+map[k,l]; end;writeln(f[n,m,n,m]);end;begininit;prepare;main;outit;end.var a:array[1..50,1..50] of integer;f:array[1..100,1..50,1..50]of integer;m,i,j,n,total,k,x1,x2:integer;function max(s1,s2,s3,s4:integer):integer;var s:integer;begins:=s1;if s2>s then s:=s2;if s3>s then s:=s3;if s4>s then s:=s4;max:=s;end;beginassign(input,'message.in');reset(input);assign(output,'message.out');rewrite(output);readln(m,n);for i:=1 to m dofor j:=1 to n doread(a[i,j]);fillchar(f,sizeof(f),0);for k:=2 to m+n-2 dofor x1:=1 to k dofor x2:=1 to x1-1 dobeginf[k,x1,x2]:=max(f[k-1,x1,x2],f[k-1,x1,x2-1],f[k-1,x1-1,x2],f[k-1,x1-1,x2-1]);f[k,x1,x2]:=f[k,x1,x2]+a[x1,k+1-x1]+a[x2,k+1-x2];end;writeln(f[m+n-2,m,m-1]);close(input);close(output);end.4. 双栈排序(twostack.pas/c/cpp)【问题描述】Tom最近在研究一个有趣的排序问题。