#qJDPybttg050106. 1574:矩阵取数游戏
1574:矩阵取数游戏
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
原题来自:NOIP 2007
帅帅经常和同学玩一个矩阵取数游戏:对于给定的 的矩阵,矩阵中每个元素 均为非负整数。游戏规则如下:
- 每次取数时必须从每行各取走一个元素,共 个, 次取完所有元素;
- 每次取走的各个元素只能是该元素所在行的行首或行尾;
- 每次取数都有一个分值,为每行取数得分之和,每行取数得分 被取走元素值 ,其中 表示第 次取数,从 开始计数;
- 游戏结束时,总得分为 次取数得分之和。
帅帅想让你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。
输入格式
输入包括 行:
- 第一行两个空格隔开的正整数 ;
- 接下来 行,每行 个用空格隔开的整数,表示矩阵元素。
输出格式
输出为一个整数,为所输入矩阵取数后的最大得分。
样例
样例输入 1
2 3
1 2 3
3 4 2
样例输出 1
82
样例解释 1
矩阵为:
$$\begin{bmatrix} 1 & 2 & 3 \\ 3 & 4 & 2 \end{bmatrix}$$游戏过程:
- 第一次取数(,乘 ):
第一行取行首元素 ,得分 ;
第二行取行尾元素 ,得分 ;
第一次总得分 。 - 第二次取数(,乘 ):
第一行剩余 ,取行首 ,得分 ;
第二行剩余 ,取行首 ,得分 ;
第二次总得分 。 - 第三次取数(,乘 ):
第一行剩余 ,取 ,得分 ;
第二行剩余 ,取 ,得分 ;
第三次总得分 。
总得分 。
数据范围
- 对于 的数据,,答案不超过 ;
- 对于 的数据,,。
时空限制
- 时间:
- 内存:
提示
此问题可以 逐行独立求解,因为每行的取数顺序相互独立,只需对每一行求最大得分,然后加起来。
对于一行长度为 的序列 ,每次取首或尾元素,第 次取数权重为 。
可以转化为区间 DP:设 表示剩余区间 时的最大得分。
当前取的是第 次,权重为 。
状态转移:
$$dp[l][r] = \max \big( dp[l+1][r] + a[l] \times 2^{m-(r-l+1)+1},\ dp[l][r-1] + a[r] \times 2^{m-(r-l+1)+1} \big)$$初始化 (最后一次取)。
最终该行最大得分为 。
由于 , 非常大,必须使用高精度(如 Python 的大整数或 C++ 的高精度类)。
总复杂度 ,高精度运算会额外增加复杂度,但 可以接受。