poj3934解題報告

2021-07-03 07:10:28 字數 864 閱讀 2669

題目大意:n

個小朋友排隊(每個小朋友都不一樣高)。兩個小朋友a和

b能夠互相看見當且僅當排在它們中間的小朋友比a和

b都要矮。已知隊伍中一共有

m對小朋友可以互相看見,問有可能有多少種排隊方式。

思路:應該拿dp來做,一開始我還想拿遞迴生成全排列,剪枝呢~~後來看了別人思路真的絕了

那個人的思路大概是這樣:

狀態變數d[i][j]表示i個人,j個對一共有多少種方式

然後對於每一種i個人組成j對

的狀態有兩種決策:

1.(i-1)個人先組成(j-2)對,然後最矮的人插在彼此的間隙中,此時不會對原來的對數造成任何影響(因為這是最矮的)

if(j>=2)

d[i][j]=(d[i-1][j-2]*(i-2))%9937;

//中間有i-2個空可以讓他插

2.(i-1)個人先組成(m-1)對,然後最矮的人照在兩側,此時也不會對原來的對數產生任何影響,而且只增加了一對。

(d[i][j]+d[i-1][j-1]*2) //  一首一尾兩種情況

所以狀態方程:

if(j>=2)

d[i][j]=(d[i-1][j-2]*(i-2))%9937;

if(j>=1)

d[i][j]=(d[i][j]+d[i-1][j-1]*2)%9937;

邊界自己想吧 ~~

#include

#include

#include

#include

using namespace std;

int main()

while(cin>>n>>m)

{if(n==0&&m==0) break;

cout<

poj解題報告 1328

不得不說,這題是讓我飽受折磨,畢竟第一次做貪心演算法,而且wa了好多次,幸好有學長的幫助,最終找到了問題所在,是在快排上是問題,double高位不可向int低位轉換,由於一開始強制轉換導致雖然樣例和其他的測試資料過了,但還是wa,現在改完了就對了,附上ac ps 這題通過率是22 真心不簡單 如下 ...

poj解題報告 2586

這題我是用的貪心演算法,其實不用也可以,列舉也能解決,因為情況不多。因為是每連續5個月必有虧損,而一年只有1 5,2 6,3 7,4 8 8 12共8種情況。現在設盈餘為s,虧損為d,可列出以下幾種情況。ssssdssssdss 4ssssddsssddss 3s 2d ssdddssdddss 2...

poj解題報告 2635

這題特別好理解,就是 坑啊。題意就是給乙個數,這個數是兩個大素數的積,再給出乙個數,如果最小的素數比給的數大,列印good,否則列印bad和最小的素數。這題用的方法是高精度求模 同餘模定理。還有素數打表,把10 6內的素數全部預打表,在求模時則列舉到小於l為止。注意打表不能只打到100w,要保證素數...