[Swift]白駿から1740-RGB 2

1587 ワード


問題のショートカット
RGB距離の問題を解決したら、これはとても役に立つ問題です...!
RGB距離プール
だって、ドアを付けて、1軒目の家の値をそれぞれR、G、Bに指定すれば、考えられるから!
だから….
最初に最初の家の値をRに指定した場合.
dp[1][0] = R
dp[1][1] = MAX
dp[1][2] = MAX
最初のセットの値がRでない場合、最小値は絶対に表示されません.
その後、RGB距離解と同じ最小値を求める.
最初の家の値がRなので、最後の家の値はRではありません.
dpを除いて[N][0]
dp[N][1]とdp[N][2]で最小値を求める.
最初の家の値がGであれば、この過程を繰り返すこともできます.
最終的に求めた最小値を出力すればよい
(ブラシ住宅のコストは最高1000で、住宅数は2~1000の間にあるため、最大可能値MAX=1000 x 1000+1)

最終回答

import Foundation

let N = Int(readLine()!)!
let max = 1000*1000 + 1

var nArray = Array(repeating: Array(repeating: 0, count: 3), count: N+1)
var dp = Array(repeating: Array(repeating: 0,count: 3), count: N+1)
var result = max

for i in 1...N {
    let a = readLine()!.split(separator: " ").map{Int(String($0))!}
    nArray[i] = a
}

for j in 0..<2 {
    let a = (j+1)%3
    let b = (j+2)%3
    
    dp[1][j] = nArray[1][j]
    dp[1][a] = MAX
    dp[1][b] = MAX
    
    for i in 2...N {
        dp[i][0] = nArray[i][0] + min(dp[i-1][1], dp[i-1][2])
        dp[i][1] = nArray[i][1] + min(dp[i-1][0], dp[i-1][2])
        dp[i][2] = nArray[i][2] + min(dp[i-1][0], dp[i-1][1])
    }
    
    result = min(result, dp[N][a], dp[N][b])

}

print(result)
  • forドアを減らすために
  • jは0でaが1、bが
  • を表す.
  • jが1の場合、aは2、bは024579182である
  • jが2の場合、aは0、bは1
    jに1と2を加えた値を3の余数で割った.