fork download
  1. # 課題12c 重み付き区間スケジューリング(最適解の計算)
  2.  
  3. n = int(input())
  4.  
  5. jobs = []
  6. for i in range(1, n + 1):
  7. s, f, v = map(int, input().split())
  8. jobs.append((i, s, f, v)) # (元番号, 開始, 終了, 重み)
  9.  
  10. # 終了時刻 f で安定ソート
  11. jobs.sort(key=lambda x: x[2])
  12.  
  13. # q(i) を計算
  14. q = [0] * (n + 1)
  15. for i in range(1, n + 1):
  16. si = jobs[i - 1][1]
  17. qi = 0
  18. for j in range(i - 1, 0, -1):
  19. if jobs[j - 1][2] <= si:
  20. qi = j
  21. break
  22. q[i] = qi
  23.  
  24. # OPT を計算
  25. OPT = [0] * (n + 1)
  26. for i in range(1, n + 1):
  27. value = jobs[i - 1][3]
  28. OPT[i] = max(OPT[i - 1], OPT[q[i]] + value)
  29.  
  30. # 出力(形式厳守)
  31. for i in range(1, n + 1):
  32. print(f"opt {i} = {OPT[i]}")
  33.  
Success #stdin #stdout 0.09s 14024KB
stdin
7
5 9 3
1 3 2
6 11 15
3 4 10
2 4 5
12 15 8
0 14 7
stdout
opt 1 = 2
opt 2 = 12
opt 3 = 12
opt 4 = 15
opt 5 = 27
opt 6 = 27
opt 7 = 35