广东工业大学2020级年ACM第一次月赛B题

先附上题目和源代码
在这里插入图片描述

#include<iostream>
using namespace std;
long long int a[101] = { 0 };
int main()
{
	a[1] = 1, a[2] = 2, a[3] = 3;
	int n;
	cin >> n;
	for (int i = 4; i <= 100; i++)
	{
		for (int j = 1; j <= i/2; j++)
		{
			if (a[i] <= a[j] * a[i - j])a[i] = a[j] * a[i - j];
		}
	}
	for (int p = 0; p < n; p++)
	{
		int q;
		cin >> q;
		cout << a[q] << endl;
	}
	return 0;
}

先对题目进行阅读理解
Dio的爱心值可以拆分,也可以不分,所以在n<=3的时候不用拆分的情况就是最大总值。
当n>3时,因为总值是乘积,例如4分解为2X2,往后的5、6、7之后的解其实都可以拆解为n个2和3的乘积,例如第五个可以拆分2X3=6,第六个可以拆分为3X3=9,再往后的数据,例如n=10时可以分解为3X3X2X2,实际上就是n=4Xn=6,以此类推。
所以,从第四个开始,就可以拆分为前面某两个数对应的最大爱心总值的乘积,并不断迭代得出该数的最大爱心总值
第i个数的最大爱心总值必然拆分为第j个数的最大爱心总值*第(i-j)个数的最大爱心总值,因为i无限拆分为2和3后,拆分出来的的由多个2和3组成的数组可以自由组合相加为两个数,而这两个数的和必然是i,并且这两个数对应的爱心总值的乘积一定小于或等于i对应的爱心总值的最大值

for (int i = 4; i <= 100; i++)
	{
		for (int j = 1; j <= i/2; j++)
		{
			if (a[i] <= a[j] * a[i - j])a[i] = a[j] * a[i - j];
		}
	}

最后根据打表所得的数据直接按位置输出就完了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值