P1018 乘积最大 题解

P1018 乘积最大

该题就是DP + 高精度
状态转移方程:
dp[ i ] [ k ] = max(dp[ j ] [ k - 1] * (i + 1 到 n 组成的数), dp[ i ] [ k ])
dp[ i ] [ k ]表示的状态为,前i个数已经放了k个乘号(包括第i位后面的乘号)

struct node {
	int val[maxn], len;
	bool exist;
}f[maxn][10], ans[maxn];

上面这代码是记录数据的结构体
len就是数据的位数,val[ ]记录每一位数字

高精度的乘法

node mul(const node& x, const node& y) {
	node nn;
	nn.exist = true;
	nn.len = x.len + y.len - 1;
	for(int i = 1;i <= nn.len; i++)
		nn.val[i] = 0;
	for(int l = 1; l <= x.len; l++){
		for(int r = 1; r <= y.len; r++){
			nn.val[l + r - 1] = x.val[l] * y.val[r];
		}
	}
	
	int q = 0;
	for(int i = 1; i <= nn.len; i++) {
		nn.val[i] += q;
		q = nn.val[i] / 10;
		nn.val[i] %= 10;
	}
	
	while(q > 0){
		nn.val[++nn.len] = q % 10;
		q /= 10;
	}
	
	return nn;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值