4週間に2回(RGB距離)
17899 ワード
1.問題リンク
https://www.acmicpc.net/problem/1149
2.試合前の計画と考え方
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!
Reference
この問題について(4週間に2回(RGB距離)), 我々は、より多くの情報をここで見つけました https://velog.io/@gyrbs22/4주차-2번RGB거리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol