64. 백준 : 행렬 곱셈 순서 (지금까지 한 거 중에 제일 어려운 듯)

2025. 12. 3. 21:39·4학년/알고리즘 문제풀이
728x90
반응형

 

행렬 여러 개가 주어진다.

ABC가 있을 경우에 (AB)C 에서 연산하는 수와 A(BC) 연산 수가 다르다.

연산 횟수를 가장 작은 값으로 해서 모든 행렬을 곱해라

 


이번 문제는 감이 너무 안 오고 오래 걸려서 여러 풀이들을 참고했다.

 

우선 문제 예시처럼 A = 5*3 , B = 3*2 , C = 2*6 로 생각해보자.

- (AB)C = 5*3*2 + 5*2*6 = 30+60 = 90

- A(BC) = 5*3*6 + 3*2*6 = 90+36 = 126

 

음,, 이 예제는 간단하다만 ABCD 처럼 1개만 추가되어도 경우의 수가 매우 다양해진다.

D = 6*7

- (AB)(CD)

- (ABC)D

- A(BC)D

- A(BCD)

...

이런 경우에는 AB, AC, AD 각각 가는 거리의 최소값을 저장해두고 쓰면 편할 것 같다.

만약 AB,BC,CD 이렇게 곱하는 경우에 A-C까지 행렬을 만드는 최소값을 알고 있다면

AC최소값 + 5*3*7 (5*3*7은 A의 행렬과 D의 행렬을 합칠 때 발생하는 연산 수) 로 AC 까지의 연산이 필요 없어진다.

DP가 적당하겠다.

 

📌구상

 

우선 정해야 하는 것들이 있다.

1) 몇 개를 계산할지

 ➡️ 한 번에 다 구하는 게 아니기 때문에, AB, BC, CD 각각 연산의 최솟값( 두 개라 뭐 나올 것도 없음)

       > 그 다음 회차에는 ABC (= min((AB)C , A(BC)) , BCD(= min((BC)D , B(CD)) 

       > 그 다음 회차에는 ABCD ...

 

그럼 이걸 하려고 할 때 필요한 건?

2) 어디서부터 어디까지 계산할지

 ➡️ i,j 를 정해두자. i부터 시작한다면 j는 i+cnt 까지 계산하면 되겠다.

 

3) 어디에서 자를건지

i,j 사이에서 k를 정해서 잘라주자.

 

4) 점화식

dp[i][j] = min(dp[i][j] , dp[i][k] + dp[k+1][j] + mat[i][0]*mat[i][1]*mat[j][1])

점화식 설명 :

1) i ~k 까지 저장된 값을 가져온다.  

2) k+1 ~ j까지 저장된 값을 더한다.

 = 현재 주어진 최솟값을 기반으로 구성

 + 행렬을 합칠 때 필요한 연산 수를 더한다.

 

행렬 6개를 합치기 위해서는, 저 연산들 중에서 가장 작은 값을 취해야 한다.

ABCDEF가 있다고 한다면 (각각 최솟값은 이미 구해져서 칸이 채워져있다고 가정)

- 빨간색 : (AB) (CDEF) 

- 노란색 : (ABC) (CDE) 

 

이 때 (AB)or(ABC) 와 (CDEF)or(CDE) 를 합칠 때 필요한 연산이 있어야 한다.

 

점화식은 다음과 같다.

 

 


지금까지 푼 문제 중에 제일 어렵다

사실 dp 테크닉이 어렵다기보다는 행렬에 대해 복습하는 게 빡셌다..

같이 대회 나가신 분이 말씀해주신 것 같이 수학을 공부하지말고 DP 문제를 많이 접해보자.

반응형

'4학년 > 알고리즘 문제풀이' 카테고리의 다른 글

66. 백준 : 색종이 만들기  (0) 2025.12.08
65. 백준 : 벽 부수고 이동하기  (1) 2025.12.04
63. 백준 : RGB 거리  (0) 2025.12.01
62. 백준 : 나무 자르기  (0) 2025.11.30
61. 백준 : N과 M(2)  (0) 2025.11.29
'4학년/알고리즘 문제풀이' 카테고리의 다른 글
  • 66. 백준 : 색종이 만들기
  • 65. 백준 : 벽 부수고 이동하기
  • 63. 백준 : RGB 거리
  • 62. 백준 : 나무 자르기
쫑알bot
쫑알bot
주로 복습 / Translator
  • 쫑알bot
    오래 못 할 짓 하지 않기
    쫑알bot
  • 전체
    오늘
    어제
    • 전체 (801)
      • 취약점 분석 (3)
        • AI 다루기 (8)
        • 분석 (0)
      • 보안 및 모의해킹 (143)
        • CTF (Capture The Flag) (91)
        • 사례_솔루션 (7)
        • 개발자라면 (4)
        • 정보보안기사 (8)
        • 악성코드 분석 (29)
      • Security Tool Making (29)
        • Exploit 자동화 ( Automated Exp.. (14)
        • NLP based Deobfuscator (15)
      • 4학년 (144)
        • 알고리즘 문제풀이 (81)
        • 캡스톤 (Capstone) (14)
        • 데이터 과학 ( Data Science ) (18)
        • IoT 실습 (15)
        • Computer Vision (15)
        • 공학윤리 (1)
      • 사진 (14)
        • [1] 빈티지 카메라 (14)
      • 3학년 2학기 (85)
        • 네트워크 (Network) (49)
        • 컴퓨터 보안(Computer Security) (21)
        • 암호학(Cryptography) (6)
        • [ 학회 ] 금융ㆍ경제 (9)
      • 공부 외 (75)
        • 기록 (18)
        • 영화 (16)
        • 조향사 (9)
        • 책 (32)
      • 3학년 1학기 (106)
        • 운영체제 (OS) (48)
        • 데이터베이스(DB) (30)
        • 알고리즘 (Algorithm) (28)
      • 프로젝트 (0)
        • 멋쟁이 사자처럼 (0)
      • 웹 보안 (5)
        • 웹 개발자가 알아야하는 보안 기초 (4)
      • 2학년 2학기 (95)
        • 컴퓨터 구조 (49)
        • 웹서비스 제작 (11)
        • 기독교 변증학 (15)
        • 이산수학 (20)
      • 2학년 1학기 (67)
        • 데이터 구조 ( Data structure ) (22)
        • 논리 설계 ( Logic design ) (26)
        • 오픈소스 소프트웨어 ( OSS ) (12)
        • JAVA (7)
      • 혼자하기 (21)
        • 웹 프로젝트 1) 뉴스 (5)
        • React (4)
        • 연습 1) OAuth (12)
      • 별 용도없음 (0)
        • 과제 중간단계 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    티스토리챌린지
    리버싱
    AI
    오블완
    악성코드
    ollama
    DP
    뉴스요약
    파이썬
    LLM
    PE_File
    분석
    알고리즘
    MCP
    악성코드분석
    보안
    DLL
    디버기
    스택
    다이나믹프로그래밍
    Claude
    LangChain
    코딩테스트
    해킹
    보안분석
    백준
    모델튜닝
    후킹
    어셈블리어
    윈도우
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
쫑알bot
64. 백준 : 행렬 곱셈 순서 (지금까지 한 거 중에 제일 어려운 듯)
상단으로

티스토리툴바