1. 程式人生 > >P1040 加分二叉樹

P1040 加分二叉樹

CP mes pan AC www. ble \n dfs org

P1040 加分二叉樹

對於有些dp來說,記憶化的正向思維會使人更好理解233.

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
long long memory[50][50];
int root[50][50];
long long data[50];
int n;
long long dfs(int l,int r)
{
    if(memory[l][r])
        return memory[l][r];
    if(l==r)
    {
        memory[l][r]=data[l];
        return
memory[l][r]; } if(l>r) { memory[l][r]=1; return 1; } long long ans=0; for(int i=l;i<=r;i++) if(ans<dfs(l,i-1)*dfs(i+1,r)+data[i]) { ans=memory[l][i-1]*memory[i+1][r]+data[i]; root[l][r]=i; } memory[l][r]=ans; return
ans; } void print(int l,int r) { if(l>r) return ; printf("%d ",root[l][r]); print(l,root[l][r]-1); print(root[l][r]+1,r); } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) root[i][i]=i; for(int i=1;i<=n;i++) scanf("
%lld",&data[i]); printf("%lld\n",dfs(1,n)); print(1,n); }

P1040 加分二叉樹