秒杀一道NOIP(全国青少年信息学奥林匹克联赛)难题:方格取数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
秒杀一道NOIP(全国青少年信息学奥林匹克联赛)难题:方
格取数
设有N×N的方格图(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。
如下图所示(见样例):
某人从图的左上角的A点出发,可以向下行走,也可以向右走,直到到达右下角的B点。
在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。
此人从A点到B点共走两次,试找出2条这样的路径,使得取得的数之和为最大。
输入输出格式
输入格式:
输入的第一行为一个整数N(表示N×N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。
一行单独的0表示输入结束。
输出格式:
只需输出一个整数,表示2条路径上取得的最大的和。
输入样例#1:
82 3 132 6 63 5 74 4 145 2 215 6 46 3 157 2 140 0 0
输出样例#1:
67
题目分析
题目要求从二维矩阵左上角走两次到右下角,走过的格子里的数字被取走(取走后格子里的数字变为0),使得两次经过的路线上的数字和最大。
既然是走两次,那么我们思考一下,如果只需要走一次,使得经过路上的数字和最大,应该怎么做呢?因为每次走的时候,只能往右或者往下,所以很容易想到一个动态规划的解法,令dp[i][j]表示到达坐标(i,j)时,所能得到的最大值,那么:
只走1次的状态转移方程
状态转移方程分析:
走一次
我们要走到格子C,只能从格子A向下走一步,或者从格子B向右走一步,所以要得到在格子C的最大值,我们只需从格子A和格子B里选择最大的那个走过来即可!也就是上面的状态转移方程!
好!现在我们知道只走一次,应该怎么解决这个问题了,那走两次的话,是不是把走一次的过程重复两次就行了呢?显然是不行的,局部最优保证不了全局最优!
那我们继续思考,如果是走两次怎么走呢?而且走过的格子,数字就被取走了,且两次走过的格子可能重合!换个说法,假设有两个人同时从左上角出发,到达右下角,是不是和走两次的情况等价!没错,就是它!继续画图,请看图:
走两次
假设两个人同时走,一个人在位置C,另一个人在位置F,那他们是怎么走过来的呢?显然他们可以从[A, D],[A,E],[B,D],[B,E]这4个组合的位置走到[C,F],同理,我们从那四个位置的组合里选择一个最大的走过来不就可以了吗?哈哈,正是如此!所以:
走两次状态转移方程
我们把A~F的位置,用矩阵的横坐标,纵坐标表示出来,即得到如下状态转移方程:
走两次的状态转移方程
到这里,我们已经这道题的状态转移方程了,可能不熟悉的读者,看到这个不知道怎么写程序,没关系,对照算法哥的一起理解吧,有读者会问,如果两个人走到同一个格子去了怎么办?没关系,我们判断一下坐标,当前格子里的数字取一次不就行了吗?哈哈,简单吧!
上源码:
复杂度分析
四层循环,显然是O(n^4)的,其实这个题目可以写成O(n^3)的,这个留给读者自己思考吧,作为高中生的信息学奥赛题,我觉得能写出O(n^4)的已经很厉害了!如果您坚持看到这里,相信您也非常厉害!
题目总结
NOIP(全国青少年信息学奥林匹克联赛)提高组的题目就分析完毕了,您觉得有难度吗?解决这个问题,关键有以下几点:1:化繁为简,先分析总结简单的情况,再推导复杂度的情况,这也是动态规划的核心思想;
2:根据状态转移方程式,正确写出程序,大家可以看到其实程序非常短;。