問題描述:
設n是乙個正整數,2*n的二維表是由正整數1,2,…,2n組成的2*n陣列,該陣列的每行從左到右遞增,每列從上到下遞增。這樣的陣列為標準二維表。
輸入乙個整數n(0
輸入n輸出乙個整數
樣例輸入
3遞迴的**:樣例輸出
5
利用遞迴時,我們基於入棧和出棧的思想來解決問題:
(1)如果元素出現在第乙個位置,則必定是:元素1先入棧、出棧;然後再對其他n-1個元素進行入棧和出棧,如果用h(n)來表示對n個數進行出棧和入棧的次數,則此種情況對應的排列數為h(n-1)。
(2)如果1出現在第二個位置,則此時的狀態必然是:元素1和2入棧,元素2出棧,元素1出棧,後面的n-2個元素出入棧。此時的排列數為h(1)h(n-2),此時h(1)代表對元素2出棧和入棧的情況;
(3)如果1出現在第3個位置,則必然是先將1入棧,再後將2、3入棧,再將2、3出棧;然後再將1出棧,最後將其他的n-3個元素進行出棧和入棧。此時的排列數為h(2)h(n-3),其中h(2)代表對2和3兩個元素進行入棧和出棧的情況。
......
(4)如果1出現在最後的位置,則必然是1入棧,再後將後面的n-1個數入棧和出棧,最後將1出棧。此時的排列數為h(n-1)。
基於加法原則,對n個元素進行出棧和入棧的排列情況數為:
h(n)=h(n-1)+h(1)h(n-2)+...+h(n-1)
如果規定h(0)=1,則第一種情況h(n-1)可以寫為h(0)h(n-1)。因此如果假設完成n次出棧和入棧的次數為h(n),則有
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)
其中初始條件為h(0)=1。
還要考慮輸出結果不要整形溢位,所以:下面的**
#includelong long numst[10000];
void per()
if(sum0!=sum1)
return 0;
return 1;}
int main()
if(judge(table,2*n))
}printf("%d\n",count);
return 0;
}
標準二維表問題
問題描述 設n 是乙個正整數。2xn的標準2維表是由正整數1,2,2n 組成的2xn 陣列,該陣列的每行從左到右遞增,每列從上到下遞增。2xn的標準2維表全體記為tab n 例如,當n 3時tab 3 如下 思路分析 首先明確一下每行的數總是左邊小於後面,上面小於下面,以上面的第一種情況進行分析,我...
標準二維表問題 窮舉
問題描述 設n 是乙個正整數。2xn的標準2維表是由正整數1,2,2n 組成的2xn 陣列,該陣列的每行從左到右遞增,每列從上到下遞增。2xn的標準2維表全體記為tab n 例如,當n 3時tab 3 如下 演算法如下 include define max 100 using namespace s...
標準2 維表問題
標準2 維表問題 問題描述 n 是乙個正整數。2n 的標準2 維表是由正整數 1,2 2n 組成的2n 陣列,該 陣列的每行從左到右遞增,每列從上到下遞增。2n 的標準2 維表全體記為tab n 例如,當n 3 時tab 3 如下 1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 4 5 ...