석자 합병 문제 - 동태적 기획, 욕심

2466 단어
참고 자료: 석자 합병 문제 - 동태 기획;탐욕스럽다
           DP  。      3   :

(1) N   ,             ,    :         2     ,                。   N      

  :             ,        ,      ,           。              。

(2) N   ,             ,    :         2     ,                。   N              (   )。

(3)  (2)                ,           ,     ?
--------------------- 
  :JeanCheng 
  :CSDN 
  :https://blog.csdn.net/gatieme/article/details/49206193 
    :         ,         !
  • 왜 첫 번째 질문은 욕심 알고리즘이 가장 좋은 해법을 얻을 수 있습니까?증명: 돌무더기는 나무의 잎으로 간주된다. 매번 우리는 두 무더기를 합쳐서 새로운 무더기를 얻은 다음에 다른 무더기와 계속 합쳐서 나무 한 그루를 얻는다.총 대가는 모든 잎 노드의 대가에 뿌리 노드까지의 경로 길이를 곱한다.욕심 알고리즘으로 얻은 나무는 잎 노드의 대가가 작은 것이 항상 더 길거나 같다. 다른 알고리즘은 적어도 두 개의 잎 노드(크기가 다르다)가 욕심 알고리즘과 반대로 나무의 구조에 따라 대가가 더 큰 잎 노드의 경로가 더 길다. 이렇게 얻은 나무의 대가가 더 크다고 할 수 있다.
  • 두 번째 문제: 동적 기획 아래 프로그램에서 p매트릭스 저장은 어디에서 반으로 나누는 것이 가장 좋은가
  • import numpy as np
    
    
    def merge_stones(stones):
        num_stones = len(stones)
    
        m = np.zeros(shape=(num_stones,num_stones))
        p = np.zeros(shape=(num_stones,num_stones))
    
        for i in range(num_stones - 1):
            m[i][i+1] = stones[i] + stones[i+1]
    
        for i in range(1,num_stones-1):
            for j in range(num_stones - 1 - i):
                k = j + i + 1
    
                min = 10000000000000
                for l in range(j+1,k):
                    temp = m[j][l] + m[l+1][k] + np.sum(stones[j:k+1])
                    if min > temp:
                        min = temp
                        min_p = l
    
                m[j][k] = min
                p[j][k] = min_p
    
        return m[0][num_stones-1],p
    
    
    def print_ret(stones,p,start,last,first_part=False):
        if start < last:
            print('(',end='')
            mid = int(p[start][last])
            print_ret(stones,p,start,mid,True)
            print_ret(stones,p,mid+1,last,False)
            print(')',end='')
        else:
            print(stones[start],end='')
    
        if first_part:
            print(',',end='')
    
    
    if __name__ == '__main__':
        # while True:
        #     num_stones = int(input('Input:
    ')) # stones = [] # for s in map(int, input().split()): # stones.append(s) # # if num_stones == len(stones): # merge_stones(stones) # else: # print(' ') max,p = merge_stones([4,4,5,9]) print_ret([4,4,5,9],p,0,len([4,4,5,9])-1)
  • 세 번째 문제: 위의 문제와 비슷합니다. 단지 동그라미가 있을 뿐입니다.
  • 좋은 웹페이지 즐겨찾기