oj
題意非常的明確,我們直接來進行分析,要求出最小的移動距離,其實非常容易的我們就能想到兩個手指最開始的位置,一定都是在鍵盤中的某個輸入串中包含的字元上面的,但是我們並不能確定在哪個位置。不過,我們能確定其中乙個手指最開始的位置,那就是輸入串第乙個字元所在位置,這一點其實非常容易想通,因為我們不管把手指放在什麼位置,都要移動去輸入第乙個字元,那還不如直接放在第乙個字元上,但是第二個手指並不能這樣確定。還有一點就是,每當我們輸入乙個字元之後,乙個有乙個手指是在當前輸入字元的位置上的。
再進行分析我們能發現,當我們輸入字串結束之後,其實是一種狀態轉換,我們假設現在兩個手指乙個l乙個r,當面臨乙個待輸入的字元的時候,我們要麼拿l去按,要麼拿r去按。那到達拿哪個呢?拿距離最近的那個嗎?其實不對,拿最近的乙個只是乙個區域性的最優解(當前步最優),但是對於整個問題來說,可能並不是最優解。比如你可以嘗試一下「zknbz」,這個輸入串按照這種思路是不能得到乙個最小的結果的。
雖然這種方式不行,但是根據我們前面的分析,我們至少能得乙個狀態轉移方程了。其中包含l,r,和當前輸入串的下標index。我們就能得到乙個狀態轉移方程了。dp[index][l][r],表示當前在輸入串的下標i的位置,l手指在鍵盤第l個位置,r手指在鍵盤的第r個位置的最小移動距離,那麼轉移方程就為
dp[1]
[l][r]
= math.
min(dp[1]
[l][r]
, dp[0]
[l][r]
+move
(l, l))或
dp[1
][l]
[r]= math.
min(dp[1]
[l][r]
, dp[0]
[l][r]
+move
(r, r)
)其中的l和r表示上乙個狀態l手指或者r手指所在位置
注意觀察,如果移動的是l手指,那麼上乙個階段右指為 r,此時這個階段右指也必須保持不變,同樣為r
根據狀態轉移方程我們就能寫出dp公式了
優化空間
因為當前輸入字元的狀態只依賴其前乙個輸入字元的狀態,所以可以利用滾動陣列來優化,這也是dp的常用優化手段了。
優化時間
我們可以換乙個想法,我們只記錄其中乙個手指所在位置和當前輸入串的下標。
我們利用輸入串的下標,完全可以推斷出另外乙個手指的位置,因為你輸入了下標為i的位置的字元,那麼你一定有乙個手指在對應的位置上。所以我們就利用了兩個狀態來表示上面的三個狀態了
時間優化後的**實現,空間沒有優化
public
intminimumdistance
(string word)
for(
int i =
0; i < word.
length()
; i++
)int min = integer.max_value;
for(
int i =
1; i < word.
length()
; i++)}
}if(i == word.
length()
-1)}
}return min;
}// 計算距離
public
intdis
(int a,
int b)
這乙個狀態轉移方程與上面一樣,有一點點不同,可以擴充想法
public
intminimumdistance
(string word)
for(
int i =
0; i < word.
length()
; i++
)int min = integer.max_value;
for(
int i =
1; i < word.
length()
; i++
)int disa =
dis(word.
charat
(i -1)
-'a'
, cur)
;int disb =
dis(j, cur)
; dp[i]
[j]= math.
min(dp[i -1]
[j]+ disa, dp[i]
[j])
; dp[i]
[word.
charat
(i-1)-
'a']
= math.
min(dp[i -1]
[j]+ disb, dp[i]
[word.
charat
(i-1)-
'a']);
if(i == word.
length()
-1)}
}return min;
}
C語言 二 指標
一 指標概述 1.簡介 2.初始化 1 先定義後初始化 int a 10 int p p a 2 定義並初始化 int a 10 int p a 備註 在資料型別後,變數名稱前的 是乙個說明符,用來說明該變數是乙個指標變數。如果前面沒有資料型別,如 p,這裡的 是乙個指標運算子,用來取出指標變數所指...
proc c 程式設計(二) 指示變數
指示變數 與宿主變數相關聯,用於監督和管理相關聯的宿主變數。每乙個宿主變數可以定義乙個指示變數。作用 1.向資料庫表列輸入null值。2.檢查資料庫所取值是否為null值,或者發生截斷問題。指示變數值含義 輸入宿主變數 1 oracle把null值輸入資料庫表列,不考慮與該指示變數相關的宿主變數。0...
Vue基本使用二 指令
指令 directives 是帶有 v 字首的特殊屬性 用來設定當前元素的文字內容。相當於 innertext 的功能 v text msg 預設的文字內容h1 v html msg 預設的文字內容h1 v bind title msg v bind zhidingyi xm 預設的文字內容h1 t...