Pythonアルゴリズム-76(DP)最高塔スタック


76.最も高い塔を建てる
下に正方形の六面体レンガで塔を建てたいです.塔は下から上へれんがを積んでできている.以下の条件を満たして最も高い塔を建てるためのプログラムを作成してください.
(条件1)レンガが回らない.すなわち、側面を底部として使用することはできない.
(条件2)底幅が等しい煉瓦も、重量が等しい煉瓦もない.
(条件3)レンガの高さは同じである可能性がある.
(条件4)塔を建てる場合、底の狭いレンガには底の広いレンガを置くことができません.
(条件5)重煉瓦を軽煉瓦の上に置くことはできません.
■説明の入力
入力ファイルの最初の行には、入力するレンガの数が表示されます.レンガを最大100枚入力します.2行目から、各行は、レンガの底の幅、レンガの高さ、および重量の順に正の整数であるレンガに関する情報を与える.各タイルは入力順に1から連続番号までです.レンガの幅、高さ、および重量が10000以下の自然数.
■出力説明
最初の列で一番高く積み上げられる塔の高さを出力します.
■入力例1
5
25 3 4
4 4 6
9 2 3
16 2 5
1 5 2
■出力例1
10
マイコード
n=int(input())
lst=[list(map(int,input().split())) for _ in range(n)]
# 같은 넓이/무게는 없다고 했으므로 넓이/무게 하나에 대해서만 내림차순 정렬하면 된다. 람다 쓸 필요 없음
lst=sorted(lst, key=lambda x: (x[0],x[2]), reverse=True)

dy=[0]*(n)
dy[0]=lst[0][1]
for i in range(1,n):
    max_num=0
    for j in range(i-1,-1,-1):
        # 이미 넓이/무게 중 하나는 정렬되어 있으므로 정렬하지 않은 조건만 크기비교하면 된다.
        if lst[j][0]>lst[i][0] and lst[j][2]>lst[i][2] and dy[j]>max_num:
            max_num=dy[j]
    dy[i]=max_num+lst[i][1]

print(max(dy))
余分なコードがたくさんありますが、これまでの問題を適用し、比較対象を追加して並べ替えた後、繰り返し文を実行しました.
に答える
n=int(input())
bricks=[]
for i in range(n):
    a, b, c=map(int, input().split())
    bricks.append((a, b, c))
bricks.sort(reverse=True)
dy=[0]*n
dy[0]=bricks[0][1]
res=bricks[0][1];
for i in range(1, n):
    max_h=0;
    for j in range(i-1, -1, -1):
        if bricks[j][2]>bricks[i][2] and dy[j]>max_h:
            max_h=dy[j]
    dy[i]=max_h+bricks[i][1]
    res=max(res, dy[i])
print(res)
これは,これまでに解いた最大部分増加数列に適用された問題である.これまでの問題とは異なり,比較サイズのオブジェクトが追加された点はソート可能である.
反省点
  • 題を正しく読んでいないため、不要なコードがたくさんあります.
  • 学識