int n,a[maxn],prefix[maxn]; int dp1[maxn][maxn],dp2[maxn][maxn]; int ma,mi;
intmain(void){ cin>>n; for(int i = 1 ; i <= n ; i ++){ cin>>a[i]; a[i+n] = a[i]; } for(int i = 1 ; i <= 2*n ; i ++){ prefix[i] = prefix[i-1] + a[i]; } memset(dp1,inf,sizeof(dp1)); memset(dp2,-inf,sizeof(dp2)); for(int i = 1 ; i <= 2*n ; i ++){ dp1[i][i] = dp2[i][i] = 0; } for(int i = 2 ; i <= n ; i ++){ for(int j = 1; j+i-1 < 2*n ; j ++){ int l = j; int r = j+i-1; int sum = prefix[r] - prefix[l-1]; for(int k = l ; k < r; k ++){ dp1[l][r] = min(dp1[l][r], dp1[l][k] + dp1[k+1][r] + sum); dp2[l][r] = max(dp2[l][r], dp2[l][k] + dp2[k+1][r] + sum); } } } ma = -inf; mi = inf; for(int i = 1 ; i+n-1 < 2*n ; i ++){ mi = min(mi, dp1[i][i+n-1]); ma = max(ma, dp2[i][i+n-1]); } cout<<mi<<"\n"<<ma; return0; }
intmain(void){ cin>>n; for(int i = 1 ; i <= n ; i ++){ cin>>h[i]; h[i+n] = h[i]; } for(int i = 2 ; i <= n ; i ++){ for(int j = 1 ; j+i-1 < 2*n ; j ++){ int l = j; int r = j+i-1; for(int k = l ; k < r ; k ++){ dp[l][r] = max(dp[l][r], dp[l][k] + dp[k+1][r] + h[l]*h[k+1]*h[r+1]); } } } for(int i = 1 ; i+n-1 < 2*n ; i ++){ ans = max(ans,dp[i][i+n-1]); } cout<<ans; return0; }
int n,cnt; int w[maxn], pre[maxn], dp[maxn][maxn], root[maxn][maxn];
voidpre_order(int l, int r){ if(l > r) return; int k = root[l][r]; cout<<k<<" "; pre_order(l, k-1); pre_order(k+1, r); }
intmain(void){ cin>>n; for(int i = 1 ; i <= n ; i ++){ cin>>w[i]; dp[i][i] = w[i]; root[i][i] = i; } for(int i = 2 ; i <= n ; i ++){ for(int j = 1 ; j+i-1 <= n ; j ++){ int l = j; int r = j+i-1; for(int k = l ; k < r ; k ++){ int lt = k-1 >= l ? dp[l][k-1] : 1; int rt = k+1 <= r ? dp[k+1][r] : 1; if(lt*rt + w[k] > dp[l][r]){ dp[l][r] = lt*rt + w[k]; root[l][r] = k; } } } } cout<<dp[1][n]<<"\n"; pre_order(1,n); return0; }
int n; string w[maxn]; string dp[maxn][maxn]; int a[1000],b[1000],c[1000];
string mul(string x, string y){ memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); string ans = ""; int la = x.length(); int lb = y.length(); int lc = la + lb;
for (int i = 0; i < la; i++) a[i] = x[la - i - 1] - '0'; for (int i = 0; i < lb; i++) b[i] = y[lb - 1 - i] - '0';
for (int i = 0; i < la; i++) { for (int j = 0; j < lb; j++) { c[i + j] += a[i] * b[j]; c[i + j + 1] += c[i + j] / 10; c[i + j] %= 10; } } while ((c[lc - 1] == 0) && (lc > 1)) lc--; for (int i = lc- 1; i >= 0; i--){ ans.push_back(c[i] + '0'); } return ans; }
string add(string x, string y){ memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); int la = x.length(); int lb = y.length(); int lc = max(la, lb); for (int i = 0; i < la; i++) a[i] = x[la - i - 1] - '0'; for (int i = 0; i < lb; i++) b[i] = y[lb - 1 - i] - '0'; for (int i = 0; i < lc; i++) { c[i] += a[i] + b[i]; c[i + 1] += c[i]/10; c[i] %= 10; } lc++; while (lc > 1 && c[lc-1] == 0) lc--; string res = ""; for (int i = lc-1; i >= 0; i--){ res.push_back(char(c[i] + '0')); } return res; }
string Min(string x, string y){ int lx = x.size(); int ly = y.size(); if(lx > ly) return y; elseif(ly > lx) return x; else{ for(int i = 0 ; i < lx ; i ++){ if(x[i] < y[i]) return x; elseif(x[i] > y[i]) return y; } } return x; }
intmain(void){ cin>>n; for(int i = 1 ; i <= n ; i ++){ cin>>w[i]; } for(int i = 3 ; i <= n ; i ++){ for(int j = 1 ; j+i-1 <= n ; j ++){ int l = j; int r = j+i-1; for(int k = l+1 ; k < r ; k ++){ string sum = mul(mul(w[l],w[k]),w[r]); if(dp[l][r].empty()) dp[l][r] = add(dp[l][k], add(dp[k][r], sum)); else dp[l][r] = Min(dp[l][r], add(dp[l][k], add(dp[k][r], sum))); } } } cout<<dp[1][n]; return0; }