P1005 矩阵取数游戏

P1005 矩阵取数游戏

题目大意:给定一个n*m的非负整数矩阵,每次从每行行首或行尾取一个数;每取一个数都有一个对应的得分,得分值=被取走的数 * \(2^i\),其中 i 表示第 i 次取数,求取完所有数之后的最大得分;值得注意的一点是,每一次取数都在所有的行中各取一个数,共算作一次,所以共经过m次后取完所有的数

从题中不难发现,对于每一次取数的每一行,都有两种决策,即取行首或取行尾;而每一行取的是那个数并不影响其他行怎么取、取的是什么数,所以我们只需要处理每一行的取数决策就可以了

一开始我采用了贪心的做法,每次取数都比较行首和行尾的数字,从中取较小的数,这样就可以之后用较大的数乘上较大的\(2^i\)(下称“得分权值”),借此得到最大的分数;但是这样的思路有很明显的逻辑漏洞:对于每一行的正数第二个数和每一行的倒数第二个数,在我们取完行首,行尾的数之前是不能取的,如果行首的数是一个较小的数,第二个数是一个很大的数,而行尾的数是一个较大的数,倒数第二个数很小,就会导致在一开始取走了较大的数,使得最终的答案不一定能够最大化,因为总有一个时刻不得不用一个较小的数乘一个较大的得分权值,或不得不用一个较大的数乘一个较小的得分权值;事实证明,采用这种思路只能得到可怜的20分

然后想到了DP的思路,毕竟每一行的取数决策并不会影响其他行,且每次的答案累加方式都很格式化,我们可以轻易地在思考后得到每一行得分的状态转移方程:\(f_{i,j}=max(f_{i+1,j}+a_{k,i}*2^{m+1-j},f_{i,j-1}+a_{k,j}*2^{m+i-j})\)

对于每一行,我们都可以看作是一个有m个数的数列,编号从1到m;将区间范围变为从 i 到 j 时累计的答案记做 \(f_{i,j}\),那么它一定是由 \(f_{i+1,j}\) 或者 \(f_{i,j-1}\) 转移来的,只要写出这个方程,就可以切掉这道题了

我一开始也以为是这样,然而这道题还需要开高精,事实证明不开高精只有60分

posted @ 2020-01-25 12:30  Potatoler  阅读(26)  评论(0)    收藏  举报