题目链接:围三角

算法分析

若已知三角形的三条边,我们可以通过海伦公式计算出面积

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;
}