lightoj 1173 記憶化搜尋

2021-06-20 02:40:47 字數 884 閱讀 4063

題目的意思是有n個公升高不同的人,求高矮間隔排列的數目,並且依據題目的意思,隊長肯定在第乙個。

然後這一題可以這樣想

a1 a2 a3 a4 a5.....ak 表示已經排列好了的人,然後還有n個人

那麼用   dp[n][m][1]來表示    排剩下的n個人,並且這n個人中有m個人比ak高,且接下來排的第乙個人要比ak高的 排列數

用   dp[n][m][0]來表示    排剩下的n個人,並且這n個人中有m個人比ak高,且接下來排的第乙個人要比ak矮的 排列數

這樣記錄之後就能夠做到避免對一些反覆用到的資料的重複計算,而這正是動態規劃所要做的。

然後就這樣啦~~~~自己做出來的好開心~~~~

ac**如下:

#include #include #include #include #include using namespace std;

int n, m;

unsigned long long mod;

unsigned long long dp[51][51][2];

unsigned long long dfs( int n, int m, int statu )

if( n == 1 )else

} unsigned long long ans = 0;

if( statu == 1 )

}else

} dp[n][m][statu] = ans;

return dp[n][m][statu];

}int main()elseelse

} cout << "case " << case++ << ": " << ans<< endl;

} return 0;

}

Lightoj 1071 記憶化搜尋

題目的意思是說 在乙個二維的方格中有一些人需要幫助,你需要從左上角走到右下角,然後再返回左上角,而且每次走的不能重複,向下的時候只能向下或向右走,返回的時候只能向上或向左走,求最多能救的人數。這一題簡化一下就是要找兩條從左上到右下的路,且兩條路不能相交。可以用記憶化搜尋。用dp step r1 r2...

Lightoj 1084 記憶化搜尋(DP)

dfs cur 表示從cur開始最少能分多少組 然後next是 使cur到next最大 然後if next cur 3 if next cur 4 if next cur 5 這三個判斷是說 可以 分乙個給後面 或者分兩個給後面 或者乙個都不給後面 來組成新的小組 然後就a啦 ac 如下 inclu...

skiing 記憶化深搜

這道題就是找出一條最長連續遞減序列,並求出其長度。可以用記憶化深搜,求出每一點最長序列的長度,然後求最大值即可。如下 include includeusing namespace std const int n 105 int a n n m,n,f n n inline int max int a...