深度优先搜索—luogu1040加分二叉树

xiaoxiao2021-02-28  70

#include<iostream> #include<cstdio> using namespace std; int n; int a[35],dp[35][35],rt[35][35]; int dfs(int l,int r){ if(dp[l][r])return dp[l][r]; if(l>r)return 1; if(l==r)return a[l]; int res=0,root=0,tp=0; for(int i=l;i<=r;i++){ tp=dfs(i+1,r)*dfs(l,i-1)+a[i]; if(tp>res)res=tp,root=i; } dp[l][r]=res; rt[l][r]=root; return res; } void print(int l,int r){ if(l>r)return; if(l==r){ cout<<l<<" ";return; } cout<<rt[l][r]<<" "; print(l,rt[l][r]-1); print(rt[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); }
转载请注明原文地址: https://www.6miu.com/read-2628571.html

最新回复(0)