題目鏈結
題面較長,這裡不放截圖了
比較典型的記憶化搜尋題,如果不記憶化的話將有大量重複計算嚴重影響效率。這個用dp也比較複雜,因為這裡涉及到一些路徑可能往回走。這裡每次儲存起始點能夠走到最底層的左端點和右端點(這裡可以證明如果下面一排全能走到那麼每個起始點所覆蓋的區間一定是連續的,想一想,為什麼?)用乙個be陣列來判斷該點是否已經經過,若已經經過就直接返回以達到記憶化的目的,同時也可以順帶判斷能否全部到達並計數最底層不能到達的個數。如果都能到達就用貪心的線段覆蓋就可以得出答案。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
typedef
long
long ll;
using
namespace std;
int n,m;
int mp[
505]
[505];
int dpl[
505]
[505];
int dpr[
505]
[505];
bool be[
505]
[505];
int dir[10]
[5];
void
dfs(
int x,
int y)
return;}
intmain()
cnt=0;
int left=1;
while
(left<=m)
cout <<
1<< endl <}
記憶化搜尋
演算法上依然是搜尋的流程,但是搜尋到的一些解用 動態規劃 的那種思想和模式作一些儲存。一般說來,動態規劃總要遍歷所有的狀態,而搜尋可以排除一些無效狀態。更重要的是搜尋還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求...
記憶化搜尋
記憶化搜尋 演算法上依然是搜尋的流程,但是搜尋到的一些解用動態規劃的那種思想和模式作一些儲存。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求解乙個狀態,就將它的解儲存下來,以後再次遇到這個狀態的時候,就不必重新求解了。例1.題目描述 給從左至右排好隊的小朋友們分糖果,要求 1.每個小朋友都...
記憶化搜尋
原文 感謝作者。一.動態規劃 動態規劃 dynamic programming 與 分治思想 有些相似,都是利用將問題分 為子問題,並通過合併子問題的解來獲得整個問題的解。於 分治 的不同之處在 於,對於乙個相同的子問題動態規劃演算法不會計算第二次,其實現原理是將每乙個計算過的子問題的值儲存在乙個表...