poj 1189 釘子和小球 一道有趣的題

2021-07-26 14:03:22 字數 1435 閱讀 1334

一道有趣的題,不算難。

題目:description

有乙個三角形木板,豎直立放,上面釘著n(n+1)/2顆釘子,還有(n+1)個格仔(當n=5時如圖1)。每顆釘子和周圍的釘子的距離都等於d,每個格仔的寬度也都等於d,且除了最左端和最右端的格仔外每個格仔都正對著最下面一排釘子的間隙。

讓乙個直徑略小於d的小球中心正對著最上面的釘子在板上自由滾落,小球每碰到乙個釘子都可能落向左邊或右邊(概率各1/2),且球的中心還會正對著下一顆將要碰上的釘子。例如圖2就是小球一條可能的路徑。

我們知道小球落在第i個格仔中的概率pi=pi=

現在的問題是計算拔掉某些釘子後,小球落在編號為m的格仔中的概率pm。假定最下面一排釘子不會被拔掉。例如圖3是某些釘子被拔掉後小球一條可能的路徑。

第1行為整數n(2 <= n <= 50)和m(0 <= m <= n)。以下n行依次為木板上從上至下n行釘子的資訊,每行中'*'表示釘子還在,'.'表示釘子被拔去,注意在這n行中空格符可能出現在任何位置。

output

僅一行,是乙個既約分數(0寫成0/1),為小球落在編號為m的格仔中的概pm。既約分數的定義:a/b是既約分數,當且僅當a、b為正整數且a和b沒有大於1的公因子。

sample input

5 2

* * .

* * *

* . * *

* * * * *

sample output

7/16
解法:明顯的dp問題,但本人水平較弱,一直想著直接用分數計算,但精度不夠。後經高人指點。假設有2^n個球掉下來,看最後落在格擋內有幾個球就行了。

**:

//by sean chen

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

long long map[55][55];

int n,m;

char s[55][110];

int vis[55][55];

long long power(int a,int b)

int main()

map[1][1]=power(2,n); //2^n個球

for(int i=1;i<=n;i++)

for(int j=1; j<=i;j++)

}if(map[n+1][m+1]==0) //沒有小球落到格擋內

printf("0/1\n");

else

printf("%lld/%lld",map[n+1][m+1],map[1][1]);

} return 0;

}

poj 1189 釘子和小球

題目大意 乙個三角形木板,豎直立放,上面釘著n n 1 2顆釘子,還有 n 1 個格仔 當n 5時如圖1 每顆釘子和周圍的釘子的距離都等於d,每個格仔的寬度也都等於d,且除了最左端和最右端的格仔外每個格仔都正對著最下面一排釘子的間隙。讓乙個直徑略小於d的小球中心正對著最上面的釘子在板上自由滾落,小球...

poj 1189 釘子和小球 DP

有乙個三角形木板,豎直立放,上面釘著n n 1 2顆釘子,還有 n 1 個格仔 當n 5時如圖1 每顆釘子和周圍的釘子的距離都等於d,每個格仔的寬度也都等於d,且除了最左端和最右端的格仔外每個格仔都正對著最下面一排釘子的間隙。讓乙個直徑略小於d的小球中心正對著最上面的釘子在板上自由滾落,小球每碰到乙...

一道有趣的Try catch finally的題

package com public class tryreturnfinally catch exception e finally return x public static void main string args 為何這個輸出是2?在 return x xx 和 x debug後,先進入...