思路:
区间dp
#include<cstdio> #include<iostream> #include<cstdio> using namespace std; const int maxn = 210; inline void qread(int &x){ x = 0; register int ch = getchar(); while(ch < '0' || ch > '9') ch = getchar(); while(ch >= '0' && ch <= '9') x = 10 * x + ch - 48, ch = getchar(); } int dp[maxn << 1][maxn << 1]; int n; int data[maxn << 1]; int main(void){ qread(n); for(int i=1; i<=n; ++i){ qread(data[i]); data[i+n] = data[i]; } data[n << 1 | 1] = data[1]; for(int L = 1; L < n; ++L) for(int i = 1; i <= 2 * n - L; ++i){ int j = i + L; dp[i][j] = 0; for(int k = i; k < j; ++k) dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j] + data[i] * data[k + 1] * data[j + 1]); } int ans = 0; for(int i=1; i<=n; ++i) ans = max(ans, dp[i][i + n -1]); printf("%d\n", ans); }