#include <iostream>
#include <vector>
int main() {
int n;
std::cin >> n;
std::vector<int> w(n);
for (int i = 0; i < n; i++) {
std::cin >> w[i];
}
int score = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
score += w[i] * w[j];
}
}
std::cout << score << std::endl;
}
// 64 位输出请用 printf("%lld")
题目解析:
假设有四堆石子,分别是a、b、c、d。怎么样才最优解,我显示想到动态规划,但是试验了后发现不行。那排列顺序会有影响吗,那就先假设a <= b <= c <= d。先按从小到大的顺序合并:ab + (a + b)c + (a + b + c)d = ab + ac + bc + ad + bd + cd。再按从大到小顺序合并:dc + (d + c)b + (d + c + b)a,可以得出与从小到大顺序的结果一样。随机顺序也是一样的。而且可以发现结果是两两相乘之和。直接模拟就得出。



京公网安备 11010502036488号