树上dfs

加分二叉树  https://www.luogu.org/problem/P1040

总结:

1.学会了树上搜索的一些结构(判断叶节点...)

2.递归前序输出

#include<bits/stdc++.h>
using namespace std;
int root[35][35], a[35], dp[35][35];
int n;
long ans, res;

int dfs(int l, int r)
{
	if(l > r) return 1;
	if(dp[l][r] != -1) return dp[l][r];
	if(l == r) 
	{
		root[l][r] = l;
		dp[l][r] = a[l];
		return dp[l][r];
	}
	int sum = 0;
	for(int i = l; i < r; i++)
	{
		res = dfs(l, i-1)*dfs(i+1, r) + a[i];
		if(res > sum)
		{
			sum = res;
			root[l][r] = i;
		}
	}
	dp[l][r] = sum;
	return dp[l][r];
}

void print(int l, int r)
{
	if(l > r) return;
	cout << root[l][r] << " ";
	print(l, root[l][r] - 1);
	print(root[l][r] + 1, r);
}

int main()
{
	memset(dp, -1, sizeof(dp));
	cin >> n;
	for(int i = 1; i <= n; i++)
	 	cin >> a[i];
	ans = dfs(1, n);
	cout << ans << endl;
	print(1, n);
	return 0;
} 

  

猜你喜欢

转载自www.cnblogs.com/lovezxy520/p/11267404.html