diff --git a/TangDou/LanQiaoBei/ZhongGaoJi/LanQiao15STEMA202401/7.cpp b/TangDou/LanQiaoBei/ZhongGaoJi/LanQiao15STEMA202401/7.cpp new file mode 100644 index 0000000..c6a35b3 --- /dev/null +++ b/TangDou/LanQiaoBei/ZhongGaoJi/LanQiao15STEMA202401/7.cpp @@ -0,0 +1,59 @@ +#include +using namespace std; +typedef long long LL; +/* +4 +1 2 3 4 +*/ +const int N = 110; +struct Node { + int num; // 啥数 + int left, right; // 左侧是哪个节点,右侧是哪个节点 +} a[N]; +int st[N]; +int n; +LL res; +void dfs(int r, LL sum) { // u:本轮选择哪个靶子, r:剩余几次机会 sum:已经取得的累加和 + if (r == 0) { + res = max(res, sum); + return; + } + + for (int u = 1; u <= n; u++) { + if (!st[u]) { + int L = a[u].left, R = a[u].right; + + st[u] = 1; // u号靶子被标识为已放倒 + a[L].right = R; + a[R].left = L; + + // 深搜 + dfs(r - 1, sum + a[L].num * a[u].num * a[R].num); + + // 回溯 + a[L].right = u; + a[R].left = u; + st[u] = 0; // u被扶了起来 + } + } +} + +int main() { + cin >> n; + for (int i = 1; i <= n; i++) cin >> a[i].num; + + // 左右哨兵 + a[0].num = 1; + a[n + 1].num = 1; + + // 预处理 + for (int i = 1; i <= n; i++) { + a[i].left = a[i - 1].num; + a[i].right = a[i + 1].num; + } + + dfs(n, 0); + + cout << res << endl; + return 0; +} \ No newline at end of file