puntos binarios (DP intervalo, árbol DP)

Nn se proporciona un árbol binario de nodos en orden previo como (1,2,3, ..., n1,2,3, ..., n), donde el número 1,2,3, ..., n1,2,3, ... , n es un número de nodo. Cada nodo tiene una puntuación (ambos números enteros positivos), referido a la segunda fracción nodo II es di, treedi, árbol y cada uno de su subárbol tiene una ventaja, cualquier subtreesubtree subárbol (en sí misma comprende también treetree) el bono se calcula de la siguiente manera:

Del subárbol izquierdo subtreesubtree parcial × subtreesubtree subárbol derecho de la raíz puntos + fracción de subtreesubtree.

Si un sub-árbol está vacío, lo dispuesto en los que se dividen en 11 puntos, además de hojas resultados extra es el nodo hoja en sí. Independientemente de su árbol vacío.

Determinar un orden previo se ajusta a (1,2,3, ..., n1,2,3, ..., n) y los más altos puntos de la treetree árbol binario. Producto previsto;

(1) treetree puntos más altos

(2) treetree un preorder traversal

Formato de entrada

Línea 11: 11 número entero n (n <30) n (n <30), es el número de nodos.

Línea 22: números enteros nn separados por espacios, cada nodo como una fracción (fracción <100 <100).

Formato de salida

Línea 11: 11 números enteros, los puntos más altos (Resp \ le 4,000,000,000≤4,000,000,000).

Línea 22: nn números enteros separados por espacios, para la preventa de recorrido del árbol.

entrada y salida de la muestra

Entrada # 1 copia

5 
5 7 1 2 10

Salida # 1 copia

145 
3 1 2 4 5

ideas:

  1. Las raíces quedan con el fin de recorrer el subárbol izquierdo, subárbol derecho es correcta
  2. En sub-árbol en la secuencia de orden transversal, siendo como una raíz, subárbol izquierdo es la izquierda, la derecha es subárbol derecho
  3. Los puntos máximos de un árbol binario sub-árbol binario es también el más grande, más puntos
  4. Por lo tanto, puede ser considerado como el intervalo de DP, y dibujar fórmula recursiva: dp [i] [j] = max (dp [i] [j], dp [i] [m-1] * dp [m + 1] [j] + dp [m] [m]); dp [i] [j] representa la secuencia de máximo de puntos i ~ j pueden formar un árbol binario, m es una raíz número de enumeración, la gama de i ~ j
#include<iostream>
#include<algorithm>
using namespace std;
int n,mid[32][32]={0},dp[32][32];
void first(int x,int y){  //先序遍历区间X~Y,并输出序列 
	if(x==y){
		cout<<" "<<x;
		return;
	}
	if(y<x)return ;
	cout<<" "<<mid[x][y];
    first(x,mid[x][y]-1);
    first(mid[x][y]+1,y);
}
int main() {
	cin>>n;
	for(int i=0; i<=n; i++)
		fill(dp[i],dp[i]+n+2,1);
	for(int i=1; i<=n; i++)
		cin>>dp[i][i],mid[i][i]=i;
	for(int k=1; k<n; k++) {   //枚举区间大小 ,k表示间隔大小 
		for(int i=1,j=i+k; j<=n; i++,j++) {  //枚举区间起始和终点 
			for(int m=i; m<=j; m++) {  //枚举树根 
				int t=dp[i][m-1]*dp[m+1][j]+dp[m][m];  //递推式 
				if(dp[i][j]<t){
					dp[i][j]=t;
					mid[i][j]=m;  //存储树根 
				}
			}
		}
	}cout<<dp[1][n]<<endl;  //区间i到n的最大加分二叉树大小 
	cout<<mid[1][n];//输出区间1~n的树根 
	first(1,mid[1][n]-1);  //输出区间1~n-1的所有树根 
	first(mid[1][n]+1,n);
	return 0;
}

 

Publicado 42 artículos originales · alabanza ganado 16 · vistas 3403

Supongo que te gusta

Origin blog.csdn.net/qq_41542638/article/details/99656008
Recomendado
Clasificación