題目的意思是有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...