今天因为高数模拟考没怎么做题,就睡前做了这么一题,舍友也开始一起在洛谷刷题了,很开心,但是高数只考了63,很不开心,心情复杂。
思路:每一行都是独立的选择,不要因为有多行而被带到错误的思考方向,所以我们开始分析独立的一行数据,那么只有两种选择,1.选择最开头的数字 2.选择最末尾的数字, 而每次增加的分数都是2^i*选择的数字,那么我们稍加思考就可以得到状态转移方程啦。
首先,我们定义dp[i][j]为区间(i,j)可以得到的最大分数那么我们可以得出状态转移方程
dp[i][j] = max{dp[i+1][j]*2+num[i]*2, dp[i][j-1]*2+num[j]*2} (i+1 <= j)
但是通过分析,这题的m给定的数据范围上限是80,也就是说最好的情况也有2^80的大小了!这就超出了longlong的数据大小,所以我们选择用大数类来解决这一题。
因为我的大数类模板有300行左右,太长了,就不放出来了。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;