符號三角形的回溯演算法 王曉東演算法分析例題

2021-07-02 17:36:44 字數 961 閱讀 7452

題目: 下面都是「-

」。 下圖是由

14個「+」和

14個「

-」組成的符號三角形。

2個同號下面都是「+」,

2個異號下面都是「-」。

在一般情況下,符號三角形的第一行有n

個符號。符號三角形問題要求對於給定的

n,計算有多少個不同的符號三角形,使其所含的「

+」和「

-」的個數相同。

思路:我們首先要遍歷第一行的所有情況(為了簡化問題,我們用0代表+,1代表-,這樣根據異或的規則,正好滿足題意,又方便了計數)。

注意這裡要有剪枝,通過觀察我們發現,滿足條件的所有三角形中除了初始的3個字元的三角形,其他所有滿足結果要求的子三角形中,+和-的個數都是相同的,

這樣我們進行剪枝,不等的直接return。另外乙個是要特判初始的總數,奇數肯定是不行的。然後注意回溯的時候對sum值進行修改。

剩下的就是dfs的功底了。

#include#include#include#includeusing namespace std;

int n,half,ans,sum;

int s[100][100];

void dfs(int t,int sum)

{ if(sum>half||t*(t-1)/2-sum>half)//已經算出的子樹不滿足,剪枝

return ;

if(t>n)//滿足要求,相等

{ ans++;

/* 輸出滿足條件的矩陣

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

{for(int j=1;j<=n;j++)

cout<>n)

{ ans=0,sum=0;

half=n*(n+1)/2;

memset(s,0,sizeof(s));

if(half%2!=0)//總數是奇數直接判0

{ cout<<0<

符號三角形之回溯演算法

下圖是由 14個 和 14個 組成的符號三角形。2個同號下面都是 2個異號下面都是 個符號。符號三角形問題要求對於給定的 n,計算有多少個不同的符號三角形,使其所含的 和 的個數相同。include define max 100 int arr max max int n int sum 2 int...

符號三角形 回溯演算法 C

題目描述 符號三角問題 下圖是由14個 和14個 組成的符號三角形。2個同號下面都是 2個異號下面都是 在一般情況下,符號三角形的第一行有n個符號。符號三角形問題要求對於給定的n,計算有多少個不同的符號三角形,使其所含的 和 的個數相同。參考計算機演算法設計與分析第五版 王曉東 如下 include...

演算法設計 符號三角形(回溯)

給定第一行的符號 只有 數目n,每行比上一行數目少一 形成乙個倒三角 2個相同符號下面為 號,2個不同符號下面為 號,要求有多少種情況使得兩種符號數目相同。第一行為7的符號三角形之一 我們發現 由於只有兩種符號,所以我們可簡化為0 1形式 總符號數為n n 1 2,如果總數為奇數,那麼一定不可能符號...