加分二叉树
2017-10-20 15:46
176 查看
想不到dp,写了个暴力,用记忆化搜索优化a了
枚举一个根,求出子树的最大值,记录下来,一点点向下
输出序列就记录下每个区间最大值的根,从他向下分,输出
枚举一个根,求出子树的最大值,记录下来,一点点向下
输出序列就记录下每个区间最大值的根,从他向下分,输出
#include<cstdio> #include<iostream> using namespace std; int n,a[19999],toto,ans2[199999],dep[1999][1999],dp[1999][1999]; int dfs(int l,int r){ if(l>r) return 1; if(l==r) { dep[l][r]=l; return a[l]; } int ans=0,t; for(int i=l;i<=r;i++) { int tot=(dp[l][i-1]?dp[l][i-1]:dfs(l,i-1))*(dp[i+1][r]?dp[i+1][r]:dfs(i+1,r))+a[i]; if(tot>ans) { ans=tot;t=i; } } dep[l][r]=t; dp[l][r]=ans; 4000 return ans; } void dfs2(int l,int r){ if(l>r) return ; printf("%d ",dep[l][r]); dfs2(l,dep[l][r]-1); dfs2(dep[l][r]+1,r); } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); printf("%d\n",dfs(1,n)); dfs2(1,n); }
相关文章推荐