DP문제.
점화식은 dp[i][j] => i~j 까지의 최소 비용
dp[i][j]= min(dp[i][j], dp[i][k] + dp[k+1][j]) => 합친 값의 최소값을 선택. k는 i와 j의 사이값들 모두 확인해야한다.
dp[i][j]+=sum[j]-sum[j-1] (i부터 j까지의 합 추가로 더해줘야함)
O(n^3)
문제 바로가기 : boj.kr/11066
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import java.io.BufferedReader import java.io.InputStreamReader import kotlin.math.min fun main(args: Array<String>) { val br= BufferedReader(InputStreamReader(System.`in`)) repeat(br.readLine()!!.toInt()){ val n=br.readLine()!!.toInt() val arr=br.readLine()!!.split(" ").map { it.toInt() }.toIntArray() val dp=Array(n){IntArray(n)} val sum=IntArray(n) sum[0]=arr[0] for(i in 1 until n) sum[i]=sum[i-1]+arr[i] for(j in 1 until n){ for(i in j-1 downTo 0){ dp[i][j]=987654321 for(k in i until j){ dp[i][j]= min(dp[i][j],dp[i][k]+dp[k+1][j]) } if(i!=0) dp[i][j]+=sum[j]-sum[i-1] else dp[i][j]+=sum[j] } } println(dp[0][n-1]) } } | cs |
'BOJ(백준)' 카테고리의 다른 글
[BOJ] 1952번 달팽이2 (0) | 2018.12.31 |
---|---|
[BOJ] 백준 9576번 책 나눠주기 (0) | 2018.11.22 |
[BOJ] 백준 5397번 키로거 by Kotlin (0) | 2018.11.20 |
[BOJ] 백준 8983번 사냥꾼 by Kotlin (0) | 2018.11.20 |
[BOJ] 2170번 선 긋기 by Kotlin (0) | 2018.11.13 |