NOIP2007提高组复赛试题解题报告三

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4、【问题描述】

帅帅经常更同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij据为非负整数。游戏规则如下:

1. 每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有的元素;

2. 每次取走的各个元素只能是该元素所在行的行首或行尾;

3. 每次取数都有一个得分值,为每行取数的得分之和;每行取数的得分 = 被取走的元素值*2i,其中i表示第i次取数(从1开始编号);

4. 游戏结束总得分为m次取数得分之和。

帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。【输入】

输入文件game.in包括n+1行;

第一行为两个用空格隔开的整数n和m。

第2~n+1行为n*m矩阵,其中每行有m个用单个空格隔开

【输出】

输出文件game.out仅包含1行,为一个整数,即输入矩阵取数后的最大的分。【输入输出样例1】

game.in game.out

2 3 82

1 2 4

3 4 2

【输入输出样例1解释】

第1次:第一行取行首元素,第二行取行尾元素,本次的氛围1*21+2*21=6

第2次:两行均取行首元素,本次得分为2*22+3*22=20

第3次:得分为3*23+4*23=56。总得分为6+20+56=82

【输入输出样例2】

game.in game.out

1 4 122

4 5 0 5

【输入输出样例3】

game.i

n game.out

2 1

0 316994

96 56 54 46 86 12 23 88 80 43

16 95 18 29 30 53 88 83 64 67

【限制】

60%的数据满足:1<=n, m<=30,答案不超过1016

100%的数据满足:1<=n, m<=80,0<=aij<=1000

对题目的分析:初看题目名为“矩阵取数”,其实仔细分析发现问题的关键不在矩阵上。举例说明,有矩阵:

a1,a2,a3……an

b1,b2,b3……bn 有N列,但只有2行(这里考虑到书写,所以只列举了2行,大于2行也可以证明)

假设上面矩阵的最大得分取法是:a1*2+b1*2 + a2*22+b2*22……+an*2n+bn* 2n,把这个算式变换一下,将an和bn的分开提取,结果变换为a1*2+a2*22……+an*2n + b1*2+b2*22……+bn*2n。我们可以考察一下这个算式会发现:a1*2+a2*2 2……+an*2n 其实就是第一行a1,a2,a3……an的最大得分, b1*2+b2*22……+bn*2n 也是第二行b1,b2,b3……bn 的最大得分。也就是说矩阵的最大得分其实是每一行的最大得分之和,每一行的取数不会和其他行发生联系或冲突的。于是矩阵取数最大得分问题就分解为行取数最大得分问题,只要求出每一行的最大得分,然后求和,便可得出矩阵的最大得分。

再来考察一下单行取数问题的求解。首先,设函数Maxgame(i,j)(i

归纳本题:其实矩阵取数算法并不复杂,只要认真分析题目和给出的样例还有提示,抓住要点,便可以轻松解题。

相关文档
最新文档