https://www.acmicpc.net/problem/11049
11049번: 행렬 곱셈 순서
첫째 줄에 입력으로 주어진 행렬을 곱하는데 필요한 곱셈 연산의 최솟값을 출력한다. 정답은 231-1 보다 작거나 같은 자연수이다. 또한, 최악의 순서로 연산해도 연산 횟수가 231-1보다 작거나 같
www.acmicpc.net
알고리즘 분류: 다이내믹 프로그래밍
더보기
public class Main {
static Myscanner sc = new Myscanner();
static PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
static final int inf = 987654321;
public static void main(String[] args) {
int N =sc.nextInt();
int d[] = new int[501];
int[][] dp = new int[501][501];
d[0] = sc.nextInt();
d[1] = sc.nextInt();
for(int n = 1; n<N-1;n++){
d[n]=sc.nextInt();
d[n+1] = sc.nextInt();
}
d[N-1]=sc.nextInt();
d[N]= sc.nextInt();
for(int dia = 0; dia<N;dia++)
{
for(int n=1;n<=N-dia;n++){
int m = n+dia;
if(n==m){
dp[n][m]=0;
continue;
}
dp[n][m]=inf;
for(int k=n;k<m;k++){
dp[n][m] = Math.min(dp[n][m], dp[n][k]+dp[k+1][m]+d[n-1]*d[k]*d[m]);
}
}
}
System.out.println(dp[1][N]);
}
}
다이내믹 프로그래밍 문제이다.
학교에서 알고리즘에 대해 배울 때 나왔던 문제 중 이것과 비슷한 문제가 "연쇄 행렬 최소 곱셈" 문제..
사실 완전히 이해 하지 못하고 다른 사람들의 코드를 참조하여 풀었다..
다시 공부가 필요한 시점 dp는 너무 어려움..
'PS' 카테고리의 다른 글
[BOJ] 2468번: 안전 영역 (0) | 2017.06.09 |
---|---|
[BOJ] 2583번: 영역 구하기 (0) | 2017.06.08 |
[BOJ] 2667번: 단지번호붙이기(DFS) (0) | 2017.06.07 |
[BOJ] 1012번 : 유기농 배추(DFS) (0) | 2017.06.07 |
[BOJ] 1260번 : DFS와 BFS (0) | 2017.06.07 |