4週間に2回(RGB距離)


1.問題リンク


https://www.acmicpc.net/problem/1149

2.試合前の計画と考え方

  • の問題に対して動的計画法を使用する
  • セット数(N)は、色の個数(M)であると仮定し、最大限汎用コード
  • である.
  • ディックシリーズを作成し、キー値に色/値の総コストを格納して最小値
  • を求める.

    3-1. 注意事項

    조건隣の家の色は違うはずです.
    以前に選択した色は次の選択に影響します.
    現在、家の最小費用は次の家の最小費用を保証できません.결론可能なすべてのコストを見つけた後、
    最小値を求める必要があります.

    3-2. 使用する動的計画方法

  • 方式:覚書
  • の実施形態:
  • は、各ケースのコストを格納するために使用される
  • 重要情報:コード
  • を可能な限り汎用的に実施する.

    3-3. 状況を把握するための規則性の参照

  • 可能な場合は、インデックスを表示するときに不規則な
  • バイナリキー値を使用して、連続キー値の繰返し時にコストをゼロに計算する方法で記録し、
  • の結果を得た.


    3-4. ダイナミックプランニング法を使用して解く


    残念ながら一般化に失敗!
    最初の家の色を選ぶときは、すべての場合の数字をディックリストに保存し、できれば(費用)最小値を求めるまで保存します!
    
    #각 집에 칠하는 색깔을 배열로 구현하기 위해 일반화 필요
    each_house_value = [
     [26, 40, 83], [49, 60, 57], [13, 89, 99]
    ]
    
    #색깔의개수와 집의수(N)에 따른 일반화 필요
    hash_table = {
        1:{1:{},
           2:{},
           3:{}},
    
        2:{1:{},
           2:{},
           3:{}},
    
        3:{1:{},
           2:{},
           3:{}}
    }
    
    #결과저장
    result_array = []
    
    
    
    def get_minimum_value(each_house_value, color, N):
    
        #첫번째집 색깔을 선택한 이후에 나올 수 있는 비용의 경우의 수를 모두 구한 딕셔너리
        #해당 딕셔너리를 만드는 함수
        hash_table = get_hash_table(N, color, each_house_value)
    
        #위에서 구한 딕셔너리에서 가능한 경우에 대한 비용만 결과배열에 추가하여
        #결과배열중 최솟값을 구하는 함수
        result = get_result_from_hash_table(N, hash_table)
    
        return result
    
    def get_hash_table(N, color, each_house_value):
        if color == 1:
            for k in range(N):
                if k + 1 < N:
                    for i in range(N):
                        for j in range(N):
                            value = 26 + each_house_value[k][i] + each_house_value[k+1][j]
                            hash_table[color][i+1][j+1] = value
                else:
                    break
    
        if color == 2:
            for k in range(N):
                if k + 1 < N:
                    for i in range(N):
                        for j in range(N):
                            value = 40 + each_house_value[k][i] + each_house_value[k+1][j]
                            hash_table[color][i+1][j+1] = value
                else:
                    break
    
        if color == 3:
            for k in range(N):
                if k + 1 < N:
                    for i in range(N):
                        for j in range(N):
                            value = 83 + each_house_value[k][i] + each_house_value[k+1][j]
                            hash_table[color][i+1][j+1] = value
                else:
                    break
        #print(hash_table)
        return hash_table
    
    
    def get_result_from_hash_table(N, hash_table):
        for k in range(1, 3+1)
            for i in range(N):
                for j in range(N):
                    if i + 1 == k or i == j:
                        hash_table[k][i + 1][j + 1] = 0
                        continue
                    else:
                        result_array.append(hash_table[k][i + 1][j + 1])
                        continue
        result = min(result_array)
        return result
    
    get_minimum_value(each_house_value, 1, 3)
    print(get_minimum_value(each_house_value, 1, 3))

    4.説明しながら悩むところ


  • 可能な限り一般化されたコードを実装しましょう.

  • 今のコードは最初の家の色を見つけたときですが、
    理想的なコードはすべての場合の数を求めるコードです!

  • すべての場合、必要なネストされた重複文/ネストされたバイナリをどのように実装するかを考慮します.

  • アルゴリズムの実装に時間がかかりすぎる
    別の方向に考えることも大切だが、時間を節約することも大切だ.
    10分ほど考えて、実現アルゴリズムの練習に励みましょう.

  • クリーンコード
    1つのコードにすべての機能を含まないで、機能を最大限に分散します.
    조건을 입력받아 결과를 return하는 로직(메인함수)모든 경우의 수를 구해주고 딕셔너리를 작성하는 로직딕셔너리에서 가능한 경우의 수를 선별하여 비용을 저장하는 로직可読性の良いコード、分かりやすいコードの条件を考えてみましょう.
  • 5.問題を解いて理解する概念と感じ


  • loopコンセプトfor while各繰り返し文の適切な構文や変数宣言方法などを使用します.

  • 専制的
    ディック・シャナリーの発表、創設
    ネストされたディックシリーズの宣言、作成、およびアクセス

  • 0/Noneのコンセプト
    0とNoneは違うコンセプト!
    0は値があり、Noneは値がないことを示し、重複文を処理するための条件を表します.
    四半期ごとにプロセスが異なります!
  • 5-1. remind

    코드에 대한 이해가 우선이다. sugar syntax보다는 sugar logic!