최 적 화 된 두 갈래 검색 트 리 동적 계획

1663 단어 알고리즘
질문 설명:
최 적 화 된 이 진 트 리 검색 문 제 는 질 서 있 는 집합 S 와 그 액세스 확률 이나 가중치 (q0, p1, q1, p2, q2, p3, q3) 에 대해 질 서 있 는 집합 S 를 표시 하 는 이 진 트 리 에서 최소 평균 길이 의 이 진 트 리 를 찾 는 것 입 니 다.
해결 방법:
동적 계획 방법 을 사용 하여 아래 에서 위로 최 적 화 된 이 진 트 리 를 점차적으로 구성 합 니 다.
동적 계획 의 두 가지 중요 한 요 소 는:
1. 최 우수 서브 구조.2. 중첩 자 문제.
1) 최 적 화 된 서브 구 조 는 문제 의 최 적 화 된 해석 에 서브 문제 의 최 적 화 된 해석 이 포함 되 어 있 으 면 이 문 제 는 최 적 화 된 서브 구 조 를 가진다.
2) 중첩 자 문 제 는 귀속 해결 방안 에서 대량의 동일 자 문제 가 발생 하면 동일 한 자 문제 가 여러 번 중복 계산 되 어 알고리즘 의 효율 손실 이 매우 크다 는 것 을 말한다.
문제 중 q0, q1, q2, q3 는 외부 노드, 즉 검색 에 성공 하지 못 한 가중치 나 확률, p1, p2, p3 는 내부 노드, 즉 검색 에 성공 한 가중치 나 확률, T [i] [j] 는 i 에서 j 까지 의 하위 트 리, w [i] [j] 로 누적 가중치, c [i] [j] 는 나무의 대가, r [i] [j] 는 나무의 뿌리 를 저장 합 니 다.
< 1 >, 알고리즘 사고방식:
(1) 내부 노드 만 있 는 최 적 화 된 이 진 트 리 를 구성 합 니 다.
c[i-1][j]=w[i-1][i]
r[i-1][i]=i
(2) 、 구조 가 m (m > = 2) 개 내부 노드 를 가 진 최 적 화 된 검색 트 리:
c[i][j]=w[i][j]+min{c[i][k-1]+c[k][j]},i
r[i][j]=k,i
< 2 >, 알고리즘 코드:
#include
using namespace std;

const int n = 3;
int r[n+1][n+1];//             
int c[n+1][n+1];//          (      )
int w[n+1][n+1];//               

void OBST(int *p,int *q,int n);
void printOBST(int r[n+1][n+1],int i,int j,int n,int f,char ch);

int main()
{
    int p[]={0,5,10,50};//       
    int q[]={15,10,5,5};//       

    cout<0)
    {
        if(f==0)
        {
            cout<=i && t<=n)
        {
            printOBST(r,i,t,n,k,'L');//           
        }

        int m=k+1;
        if(t<=j)
        {
            printOBST(r,m-1,j,n,k,'R');//           
        }
    }
}

좋은 웹페이지 즐겨찾기