728x90
개요
문제 링크
실버 1, Greedy
크기가 단조감소하는 행렬 곱셈의 연산 순서의 최소화
접근
- 크기가 단조감소하면 당연히 큰 쪽부터 혹은 작은 쪽부터 곱해 나가야 할 것 같은데, 왜 그런지가 명확하지 않음.
- 아래 상황을 가정해보자
1) 왼쪽부터 하는 경우.....{r[i-1],c[i-1]}, {r[i], c[i]}, {r[i+1], c[i+1]}..... r[i-1] >= r[i] >= r[i+1] c[i-1] >= c[i] >= c[i+1] c[i-1] = r[i], c[i] = r[i+1]
2) 오른쪽부터 하는 경우sum_left = r[i-1]*r[i]*c[i] + r[i-1]*r[i+1]*c[i+1] = r[i-1]*c[i-1]*c[i] + r[i-1]*r[i+1]*c[i+1]
둘을 비교해보자.sum_right = r[i]*c[i]*c[i+1] + r[i-1]*c[i-1]*c[i+1] = r[i]*r[i+1]*c[i+1] + r[i-1]*c[i-1]*c[i+1]
오른쪽부터 해주는 것이 이득이 된다.sum_left - sum_right = r[i-1]*c[i-1]*(c[i]-c[i+1]) + r[i+1]*c[i+1]*(r[i-1]-r[i]) c[i]-c[i+1] >=0 && r[i-1]-r[i] >=0 이므로 sum_left >= sum_right
Pseudo code
for (i = 오른쪽부터)
sum += r[i]*c[i]*c[n]
Source code
#include <bits/stdc++.h>
using namespace std;
using ld = long long;
int main() {
int n;
cin >> n;
ld r[n], c[n];
for (int i=1; i<=n; i++)
cin >> r[i] >> c[i];
ld sum = 0;
for (int i=n-1; i>=1; i--)
sum += r[i]*c[i]*c[n];
cout << sum;
}
728x90
'백준브실골 > Greedy' 카테고리의 다른 글
백준 12237, Up and Down (Large) (0) | 2023.02.09 |
---|---|
백준 13884, 삭삽 정렬 (0) | 2023.02.08 |
백준 4889, 안정적인 문자열 (0) | 2023.02.08 |
백준 9009, 피보나치 (0) | 2023.02.08 |
백준 14926, Not Equal (0) | 2023.02.08 |
백준 23758, 중앙값 제거 (0) | 2023.02.08 |
백준 1105, 팔 (0) | 2023.02.08 |
백준 1263, 시간 관리 (0) | 2023.02.08 |
댓글