32
```
int main()
{int n,s=0;
scanf("%d",&n);
int a[101];
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);}
for (int i=0; i<n-1; i++) //n 个图形需要合并 (n - 1) 次
{
s=s+a[i]*a[i+1];
a[i+1]=a[i]+a[i+1];//模拟合并
}
printf("%d",s);
return 0;
}
◮:
◮:分数最大,每次合并当前最小的两个图形。因为每次合并两个图形 x和 y会获得 x*y的分数,并且合并后的图形大小为 x+y,如果每次都合并最小的两个,能让较小的数尽可能少地参与后续的乘法运算,因为后续合并时,合并后的数会更大,与其他数相乘时能产生更大的分数)
先对图形大小数组进行排序(升序),然后依次合并相邻的两个图形,累加每次的分数。
浙公网安备 33010602011771号