一道區間dp的水題ios
來快活啊!spa
很簡單的區間dp,思路和floyed差很少,就是須要把項鍊處理成環形code
用\(f[l][r]\)表示以\(a[l]\)開頭\(a[r]\)結尾的數串的最大和ci
轉移方程:get
\[ f[l][r]=max(f[l][r],f[l][k]+f[k][r]+a[l] \cdot a[k] \cdot a[r]) \]string
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<map> #include<string> #include<cstring> using namespace std; inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x * f; } int ans; int f[1001][1001],n,a[10010]; signed main() { cin>>n; for(int i=1; i<=n; ++i) { cin>>a[i]; a[n+i]=a[i];/*處理成環*/ } for(int i=2; i<=n+1; ++i) { for(int l=1; l+i-1<=2*n/*注意應爲2*n,由於上面處理成環了*/; ++l) { int r=l+i-1; for(int k=l+1; k<=l+i-2; ++k) { f[l][r]=max(f[l][r],f[l][k]+f[k][r]+a[l]*a[k]*a[r]); } } } for(int i=1; i<=n; ++i) { ans=max(ans,f[i][n+i]); } cout<<ans; return 0; }