题目链接:围三角
算法分析
若已知三角形的三条边,我们可以通过海伦公式计算出面积
记 dp[i][j][k]
表示用前 \(i\) 条线段拼出三角形的其中两条边分别为 \(j\) 和 \(k\) 的可行性
代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
using ll = long long;
const int MX = 1605;
bool dp[MX][MX];
inline void chmax(ll& x, ll y) { if (x < y) x = y; }
int main() {
int n;
cin >> n;
vector<int> a(n);
rep(i, n) cin >> a[i];
int s = 0;
rep(i, n) s += a[i];
int m = s/2;
dp[0][0] = true;
rep(i, n) {
for (int j = m; j >= 0; --j) {
for (int k = j; k >= 0; --k) {
if (dp[j][k]) {
dp[j+a[i]][k] = dp[j][k+a[i]] = true;
}
}
}
}
auto area = [&](int x, int y, int z) {
ll p = x+y+z;
return p * (p-2*x) * (p-2*y) * (p-2*z);
};
ll ans = 0;
for (int i = m; i >= 0; --i) {
for (int j = i; j >= 0; --j) { //如果 边长 i,j能够成三角形的两边,第三边肯定是剩下的所有数之和 s - i - j
if (dp[i][j]) {
chmax(ans, area(i, j, s-i-j));
}
}
}
cout << ans << '\n';
return 0;
}