**自 ______________白白の屋
題目鏈結
這個題目,題意都沒有弄明白,有點難度啊!這個題目是個好題。
看了大牛的結題報告:
題目分析:
假設小兔的棋盤是 8 × 8 的 ( 當然你也可以假設是其他 )。如下圖:
箭頭方向表示從該格仔下一步能去的格仔。因為不能穿越對角線,所有對角線上的格仔只有進去的箭頭,沒有出來的箭頭。
這圖畫的太好了。
觀察上圖你就可以發現,其實這是一張關於對角線對稱的圖。所有我們只要求乙個方向的值,然後乘以2即可。
我們就拿下三角來考慮。不難發現,所有在0列上的格仔,路徑數都是 1 (只能從上面過來)。
而其他格仔則都是由上、左兩個方向過來,即:f(i, j) = f(i - 1, j) + f(i, j - 1);
另外f(i, i) = f(i, j - 1) 或者 f(i, i) = f( i-1, j ) ;
**如下:
#include
using namespace std;
typedef long long int64;
int64 f[37][37];
int main()
for ( int i = 1; i
else}}
printf("%d %d %i64d\n", ca, n, 2 * f[n-1][n] );
}return 0;
}另外看別人的解題報告說這個是卡特蘭數 ( 詳細請檢視 《卡特蘭數》 ), 其實現在還不理解, 分析如下:
catalan數。。
令h(1)=1,h(0)=1,catalan數滿足遞迴式:
h(n)= h(0)*h(n-1)+h(1)*h(n-2) +
+ h(n-1)h(0) (其中n>=2)
另類遞迴式:
h(n)=((4*n-2)/(n+1))*h(n-1);
該遞推關係的解為:
h(n)=c(2n,n)/(n+1) (n=1,2,3,…)
附卡特蘭**:
#include
int main()
;int i,j,n,t=0;
a[0][0]=0;
a[0][1]=1;
a[1][1]=2;
for(i=2;i<37;i++)
return 0;
}這裡有乙個細節必須說一下 有 a*b/c 且a,b,c 是整數。 如果a*b很大資料漏出的話,改變成a/c*b是不行的 在於當 a%c!=0 時是不行的
可以這樣處理 a*1.0/c*b 這樣就可行了。
**#include
int main(void)
else}}
printf("%d %d %i64d\n",k++,n,2*dp[n-1][n]);
}return 0;
}
hdu2067 小兔的棋盤
思路 遞推 include includeusing namespace std define ll long long ll dp 36 36 int cas 1 int main description 小兔的叔叔從外面旅遊回來給她帶來了乙個禮物,小兔高興地跑回自己的房間,拆開一看是乙個棋盤,小...
HDU 2067 小兔的棋盤
problem description 小兔的叔叔從外面旅遊回來給她帶來了乙個禮物,小兔高興地跑回自己的房間,拆開一看是乙個棋盤,小兔有所失望。不過沒過幾天發現了棋盤的好玩之處。從起點 0,0 走到終點 n,n 的最短路徑數是c 2n,n 現在小兔又想如果不穿越對角線 但可接觸對角線上的格點 這樣的...
HDU 2067 小兔的棋盤 遞推
problem description 小兔的叔叔從外面旅遊回來給她帶來了乙個禮物,小兔高興地跑回自己的房間,拆開一看是乙個棋盤,小兔有所失望。不過沒過幾天發現了棋盤的好玩之處。從起點 0,0 走到終點 n,n 的最短路徑數是c 2n,n 現在小兔又想如果不穿越對角線 但可接觸對角線上的格點 這樣的...