原題連接:釘子和小球 。php
先說DP:html
DP方程極爲簡單,若是這個地方有釘子,那麼下一層的左右釘子分別繼承1/2的機率,若是沒有釘子,那麼下下層的釘子繼承該處所有機率便可。node
寫出來是這樣的:c++
if(a[i][j] == '*') a[i+1][j] += a[i][j] / 2,a[i+1][j+1] += a[i][j]/2; else a[i+2][j+1] += a[i][j];
當我美滋滋的寫完,發現題目要求提交分數。函數
這還不簡單,分母是2^n不就行了嗎。
一鍵三連WA WA WA ~~~spa
分數結構體:c++11
因而我去找了題解,發現有一個叫作分數結構體的東西。用於處理分數計算。code
原題解連接htm
它的主要東西大概是這個:blog
struct node { long long up, down; node(long long _up = 0, long long _dn = 1) : up(_up), down(_dn){}; void reduction() { long long t = gcd(up, down); up /= t; down /= t; } void print() { cout << up << '/' << down; } } f[MAXN][MAXN]; node operator*(node a, node b) { node c = node(a.up * b.up, a.down * b.down); c.reduction(); return c; } node operator+(node a, node b) { long long t = gcd(a.down, b.down); node c = node(b.down / t * a.up + a.down / t * b.up, a.down / t * b.down); c.reduction(); return c; }
上面結構體裏須要構造函數,不然計算時分母爲0就崩了。
下面兩個重載運算符。
在賦值的時候,要使用構造函數。否則編譯不過去。(c++11是能夠的可是BZOJ)
一個小坑點:
最後交的時候一直TLE,直到最後發現是在分母相乘時,由於先寫分母相乘再約分致使爆long long,順序調整一下就能夠了。