先附上题目和源代码
#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];
}
}
最后根据打表所得的数据直接按位置输出就完了