如果你区间dp只有10分,一定要注意只能取两边意味着不能出现形如f(1, r) = f(l + 1,r) + a[l] * 2^len的转移。所以方程不要写多了。
ll dp(int l, int r)
{
if(f[l][r] != -1) return f[l][r];
if(l > r) return 0;
ll sc = __int128(1) << (r - l + 1);
ll res = max(dp(l, r - 1) + sc * mat[crr][r], dp(l + 1, r) + sc * mat[crr][l]);
res = max(res, 2 * (dp(l, r - 1) + mat[crr][r]));
res = max(res, 2 * (dp(l + 1, r) + mat[crr][l]));
f[l][r] = res;
return res;
}