警示后人
查看原帖
警示后人
762588
Edgebright楼主2023/7/14 16:30

如果你区间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]);//警示后人,我把这个删了直接10->100
    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;
}
2023/7/14 16:30
加载中...