memory2

三年前写过的一道练习题

加分二叉树 LuoguP1040



#include<bits/stdc++.h>
using namespace std;
const int N=40;  
int f[N][N];
int rt[N][N];
int v[N];	
int n;
void way(int l,int r){
	if(l>r) return ;
	cout<<rt[l][r]<<" ";
	way(l,rt[l][r]-1);
	way(rt[l][r]+1,r);
}
int main(){

	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>v[i];
		f[i][i]=v[i];
		rt[i][i]=i;	
	}
	for(int i=2;i<=n;i++){
		for(int left=1;left+i-1<=n;left++){
			int right=left+i-1;
			if(f[left][right]<v[left]+f[left+1][right]){
				f[left][right]=v[left]+f[left+1][right];
				rt[left][right]=left;
			}
			if(f[left][right]<v[right]+f[left][right-1]){
                f[left][right]=v[right]+f[left][right-1];
                rt[left][right] = right;	
            }
            for(int j=left+1;j<=right-1;j++){
                if(f[left][j-1]*f[j+1][right]+v[j] > f[left][right]){
                    f[left][right] = f[left][j-1]*f[j+1][right]+v[j];
                    rt[left][right]=j;
                }
			}
		}
	}
	cout<<f[1][n]<<endl;
	way(1,n);
	return 0;
}