狀態機與線性dp的轉化(01狀態機)

2021-10-23 06:27:12 字數 1576 閱讀 1771

今天在學習單調佇列優化的時候發現乙個問題,就是發現好像01的狀態機問題都可以轉化成線性的dp問題,01 狀態機代表的狀態是選或不選,沒有多餘的狀態,而一般普通的dp所劃分的狀態即是選或不選,就像揹包問題,但是一些線性的dp表示的狀態是必選。

烽火台是重要的軍事防禦設施,一般建在交通要道或險要處。

一旦有軍情發生,則白天用濃煙,晚上有火光傳遞軍情。

在某兩個城市之間有 n 座烽火台,每個烽火台發出訊號都有一定的代價。

為了使情報準確傳遞,在連續 m 個烽火台中至少要有乙個發出訊號。

現在輸入 n,m 和每個烽火台的代價,請計算在兩城市之間準確傳遞情報所需花費的總代價最少為多少。

輸入格式

第一行是兩個整數 n,m,具體含義見題目描述;

第二行 n 個整數表示每個烽火台的代價 ai。

輸出格式

輸出僅乙個整數,表示最小代價。

資料範圍

1 ≤n

,m≤2

×105

1≤n,m≤2×10^5

1≤n,m≤

2×1050≤

ai

≤1000

0≤ai≤1000

0≤ai≤1

000

輸入樣例:

5 31 2 5 6 2

輸出樣例:

這道題目的話如果表示成01狀態機表示方法時,狀態表示定義是: 在前i個數中,表示選擇或者不選擇第i個烽火的耗費最小值。

f[i][0] = min(f[i -k][1]...)(i−

m<

k

(i - m(i

−m<

kf[i][1] = min(min(f[k][0], f[k][1])) +w[i]

我們看到這樣很麻煩, 並且有些狀態根本不合法

假設f[i][0~1]表示點燃或者不點燃第i個烽火台所花費的最小值,m表示連續m個烽火台中至少要有乙個發出訊號

f[1][0]狀態合法的條件是必須選擇2 ~ m其中的某些烽火,這樣就不滿足dp的無後效性,所以不能出現不選的狀態(是02告訴我要實踐才能找到問題的答案,謝謝!)。

#include

// ren zhen si kao

using

namespace std;

const

int n =

2e5+

10, inf =

1e9;

int f[n]

, q[n]

, w[n]

;int

main()

int res = inf;

for(

int i = n - m +

1; i <= n; i ++

) res =

min(res, f[i]);

cout << res << endl;

return0;

}

FPGA 狀態機的模型之Moore型狀態機

上篇博文 狀態機,fpga的靈魂,說到了狀態機的基礎知識,講到了狀態機的組成六要素,工作四要素。這篇博文來講狀態機的模型之moore狀態機,從標題也能看出,狀態機的知識並沒有結束,後面還會提到mealy型狀態機。根據狀態機的輸出與其現態 輸入之間的關係,可將fpga中的狀態機抽象為三種基本模型 mo...

FPGA 狀態機的模型之Mealy型狀態機

上篇博文講了 moore型狀態機,這篇博文和上篇博文思路一致,如果讀懂了上篇博文,這篇博文就很容易理解了。如果乙個狀態機的輸出是由現態和輸入共同決定的,那麼它就是乙個mealy型的狀態機。而按照驅動輸出的數位電路特性,又將mealy型狀態機細分為mealy 1型 mealy 2型 mealy 3型,...

狀態機 狀態機2,關於戰鬥中兵種狀態的新增狀態

但是了,但是策劃是種天生具備加需求的生物,而做為將需求變成 邏輯的程式猿來 說,只能say ok,i look 好吧,我看看 好吧,那來看看有什麼新的需求 戰鬥模組在有各種複雜的技能,技能中包含著一種控制行為的buff,稱為控制行為buff,比較常見的控制項行為buff有冰凍,眩暈,擊飛等等,以下是...