P1005 [NOIP2007 提高组] 矩阵取数游戏C++代码

本文介绍了一种解决NOIP2007提高组矩阵取数游戏问题的C++代码实现,通过状态转移方程进行优化,确保不超过128位的计算,并提供了详细的代码注释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

让我来一波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>
struct int128
{
    long long hig;
    long long low;
};//定义int128
int n,m;
long long p=1e18;//作mod用
int128 ans,f[85][85][85],a[85][85];
int128 max(int128 a,int128 b)
{
	if(a.hi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值