DP練習之飛彈攔截系統(hdu 1257)

2021-06-13 17:45:41 字數 1021 閱讀 6986

最近在學習dp,現在把我這幾天ac的題目整理總結一下~

dp在很多時候其實也就是變種的遞迴,其和遞迴的區別就在於dp將每次遞迴地中間結果都儲存起來了,避免了常規遞迴過程中大量的重複計算,從而大大優化的演算法的執行效率。

提到dp,就不得不提一下其非常重要的乙個組成部分,狀態轉換方程。在dp的求解過程中,會有很多的中間結果,我們將這些中間結果所構成的集合稱之為狀態,因而dp的求解也是從問題的初始狀態轉換為最終狀態的乙個過程。那麼dp的遞迴過程如何控制呢,這裡就有了狀態轉換方程。該方程可以引導當前的狀態轉向下乙個狀態。

由於dp問題的多樣性,我們很難找到乙個普適的狀態轉換方程來解決所有的問題。因此,我們需要積累相關的經驗,掌握多種具有代表性的問題求解方式。而當以後遇到相似問題時,我們可以將改問題規約到我們熟悉的某類典型問題上,從而求解之。

ok,閒話說到這兒,上題:

//-----來點兒題外話,杭電最近開放了diy板塊,在這個板塊中大家可以自己選擇contest,也可以整理專題強化訓練,而hdu1257 則是我最近參與的dp專題 裡的第1014題)

/* 改問題乍看起來 覺得是求最長非增子序列的個數的問題  由於最長非增子序列是經典的dp問題 因此會進入誤區,遞迴呼叫lics 

* 我們如果把問題反過來 假設dp[i]為當前飛彈所能達到的最遠距離, 如果下乙個高度 a[j]>a[i] 則該飛彈必定不能被當前飛彈命中 飛彈系統的個數需要增加乙個

* 如果我們仔細把後乙個問題分析一下,發現該問題變成了典型的求最長上公升子串行lcs問題了

*/#include #include #include using namespace std;

int a[30001],dp[30001];

int n,i,inp,j,max;

int main()

printf("%d\n",max);

}return 0;

}

動態規劃練習1 飛彈攔截

問題描述 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然 它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到 敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的...

成都dp總結之飛彈攔截(自己找的練習lg1020)

某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達給出...

hdu 1257 最少攔截系統 dp

簡單的dp,只要把每個系統的飛彈當前最低高度儲存一下,以後得飛彈都用最小值比他大的系統中最小值最小的就 ok 啦。每次要麼更新原來系統最低高度,要麼加進去乙個新系統。include include include include include include include include inc...