2 条题解
-
0唐甫青 LV 4 @ 2023-7-15 10:25:46
#include using namespace std; const int N = 35; int n; int h[N], ne[N], to[N], id; int dp[N][N], root[N][N]; int a[N]; int dfs(int l, int r) { if(l == r) { root[l][r] = l; return a[l]; } else if(dp[l][r]) return dp[l][r]; else { if(dfs(l + 1, r) + a[l] > dp[l][r]) { dp[l][r] = dfs(l + 1, r) + a[l]; root[l][r] = l; } if(dfs(l, r - 1) + a[r] > dp[l][r]) { dp[l][r] = dfs(l, r - 1) + a[r]; root[l][r] = r; } for(int i = l + 1; i < r; i++) { if(dfs(l, i - 1) * dfs(i + 1, r) + a[i] > dp[l][r]) { dp[l][r] = dfs(l, i - 1) * dfs(i + 1, r) + a[i]; root[l][r] = i; } } } return dp[l][r]; } void print(int l, int r) { if(l > r) return; cout << root[l][r] << ' '; if(l == r) return; print(l, root[l][r] - 1); print(root[l][r] + 1, r); } int main() { cin >> n; for(int i = 1; i <= n; i++) cin >> a[i]; cout << dfs(1, n) << endl; print(1, n); return 0; }
-
02023-6-10 9:57:09@
#include<bits/stdc++.h> using namespace std; const int N=35; int f[N][N]; int s[N][N]; int w[N]; int n; void dfs(int l,int r) { if(l>r) return; cout<<s[l][r]<<" "; dfs(l,s[l][r]-1); dfs(s[l][r]+1,r); } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>w[i]; for(int len=1;len<=n;len++) for(int i=1;i+len-1<=n;i++){ int j=i+len-1; if(len==1) f[i][j]=w[i],s[i][j]=i; else{ for(int k=i;k<=j;k++) { int left = k== i ? 1 : f[i][k-1]; int right=k==j ? 1: f[k+1][j]; int score=left*right+w[k]; if(score>f[i][j]) f[i][j]=score,s[i][j]=k; } } } cout<<f[1][n]<<endl; dfs(1,n); }
- 1
信息
- ID
- 475
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 3
- 标签
- 递交数
- 39
- 已通过
- 24
- 上传者