奇怪二叉树(区间dp)

解题说明:

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=35;
ll dp[MAXN][MAXN];
int root[MAXN][MAXN],s[MAXN],n,flag=0;
void prin(int a[MAXN][MAXN],int x,int y){
	if(flag==0){
		printf("%d",a[x][y]);
		flag=1;
	}
	else printf(" %d",a[x][y]);
	if(x<a[x][y])prin(root,x,a[x][y]-1);
	if(a[x][y]<y)prin(root,a[x][y]+1,y);
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&s[i]);
	}
	memset(dp,0,sizeof(dp));
	for(int l=1;l<=n;l++){
		for(int i=1,j;i<=n-l+1;i++){
			j=i+l-1;
			 if(i==j){
			 	dp[i][j]=s[i];
			 	root[i][j]=i;
			 	continue;
			 }
		     for(int k=i;k<=j;k++){
		      	if(dp[i][j]<(k-1<i?1:dp[i][k-1])*(k+1>j?1:dp[k+1][j])+s[k]){
		      	     dp[i][j]=(k-1<i?1:dp[i][k-1])*(k+1>j?1:dp[k+1][j])+s[k];
					   root[i][j]=k;  	   
				}
			}
		}
 	} 
	printf("%d\n",dp[1][n]);
	prin(root,1,n);
	printf("\n");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zxk_hi/article/details/80345788