这道题是一道经典的区间dp问题,前面的高精度处理显得有些麻烦,但可以套板子。
题目意思说的是给n个长度为m的数组,每次可以从左边或者右边取一个数,这个数乘上2^i就是加法,问怎么取分数最高。
由于每行的取值相互独立,即每行的最大值加在一块就是本题答案,所以一行一行的来看就好。
这种取数问题还是先考虑dp,使用dp[i][j]表示在区间(i,j)中取数的最大值。
dp数组初始化为0,顺序是从大区间取到小区间,所以i从1循环到m,j从m循环到i。
接下来考虑递归,区间(i,j)的最大值有两个方式得到,一个是区间(i-1,j)的最大值加上取第i-1个数,第二个是区间(i,j+1)的最大值加上第j+1个数。即dp[i][j] = max(dp[i][j], dp[i-1][j] + base[m-j+i-1] * ar[i-1], dp[i][j+1] + base[m-j+i-1] * ar[j+1])。
这个循环只能把区间求到大小为1的区间,最后还需要再算一下dp[i][i] + base[m] * ar[i],然后得到每一行的最大值,加在一起就是答案。