HDU 2067 小兔的棋盤

2022-08-26 07:03:12 字數 1504 閱讀 4831

**自 ______________白白の屋

題目鏈結

這個題目,題意都沒有弄明白,有點難度啊!這個題目是個好題。

看了大牛的結題報告:

題目分析:

假設小兔的棋盤是 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 現在小兔又想如果不穿越對角線 但可接觸對角線上的格點 這樣的...