让我来一波50行超长代码
首先推出状态转移方程
设
f[l][l+len][i]
表示左端点为l,右端点为l+len,第i行取数所能获得的最大值
很容易得出
f[l][l+len][i]=max(2*f[l+1][l+len][i]+2*a[i][l],2*f[l][l+len-1][i]+2*a[i][l+len]);
进一步推得
f[l][l+len][i]=max(f[l+1][l+len][i]+a[i][l],f[l][l+len-1][i]+a[i][l+len])*2
如此化简方便重载运算符时减少运算量
目测发现最大数为80x1000x(2^81-1)
显然不会超过128位,于是我选择手写int128
用a.hig储存a的高位,a.low储存a的低位。
高位显然不会溢出(因为只有2^81-1),所以将低位的1e18空出,防止两数相加时溢出
虽然这样一搞变成了int123 =_=
输出时要格外注意:
- 当高位为零时直接输出低位;
- 当高位不为零时直接输出高位,低位位数不足18位要补零
当初就是因为低位没补零,找了八百个小时的bag
代码(有注释)如下:
#include<cstdio&