[codevs1029]遍歷問題
試題描述
我們都很熟悉二叉樹的前序、中序、後序遍歷,在資料結構中常提出這樣的問題:已知一棵二叉樹的前序和中序遍歷,求它的後序遍歷,相應的,已知一棵二叉樹的後序遍歷和中序遍歷序列你也能求出它的前序遍歷。然而給定一棵二叉樹的前序和後序,你卻不能確定其中序遍歷序列,考慮如下圖中的幾棵二叉樹:
所有這些二叉樹都有著相同的前序遍歷和後序遍歷,但中序遍歷卻不相同。
輸入
輸入檔案共2行,第一行表示該樹的前序遍歷結果,第二行表示該樹的後序遍歷結果。輸入的字符集合為,長度不超過26。
輸出
輸出檔案只包含乙個不超過長整型的整數,表示可能的中序遍歷序列的總數。
輸入示例
abc輸出示例cba
4資料規模及約定
見「輸入」
題解
不難發現一顆子樹所對應的前序、後序遍歷都是一段連續的子串,並且前序遍歷子串中最靠前的字元一定等於後序遍歷中最靠後的那個字元。於是就可以 dp 了,設 f(l, r, x, y) 表示對於前序遍歷字串中 [l, r] 這個子串和後序遍歷中 [x, y] 這個子串的二叉樹的數目,轉移不妨讀者自行思考。注:[l, r] 和 [x, y] 的長度一定相等,所以可以省掉一維,不過這題的資料也無所謂。
#include #include #include #include #include #include using namespace std;int read()
while(isdigit(c))
return x * f;
}#define maxn 30
int n, f[maxn][maxn][maxn];
char be[maxn], af[maxn];
int main()
// printf("[%d, %d] and [%d, %d]: %d\n", l, r, x, y, f[l][r][x]);}}
printf("%d\n", f[1][n][1]);
return 0;
}
CODEVS 1029 遍歷問題
我們都很熟悉二叉樹的前序 中序 後序遍歷,在資料結構中常提出這樣的問題 已知一棵二叉樹的前序和中序遍歷,求它的後序遍歷,相應的,已知一棵二叉樹的後序遍歷和中序遍歷序列你也能求出它的前序遍歷。然而給定一棵二叉樹的前序和後序,你卻不能確定其中序遍歷序列,考慮如下圖中的幾棵二叉樹 所有這些二叉樹都有著相同...
CODEVS 1029 遍歷問題
我們都非常熟悉二叉樹的前序 中序 後序遍歷,在資料結構中常提出這種問題 已知一棵二叉樹的前序和中序遍歷。求它的後序遍歷。對應的,已知一棵二叉樹的後序遍歷和中序遍歷序列你也能求出它的前序遍歷。然而給定一棵二叉樹的前序和後序,你卻不能確定當中序遍歷序列,考慮例如以下圖中的幾棵二叉樹 全部這些二叉樹都有著...
CODEVS 1029 遍歷問題解析
我們都很熟悉二叉樹的前序 中序 後序遍歷,在資料結構中常提出這樣的問題 已知一棵二叉樹的前序和中序遍歷,求它的後序遍歷,相應的,已知一棵二叉樹的後序遍歷和中序遍歷序列你也能求出它的前序遍歷。然而給定一棵二叉樹的前序和後序,你卻不能確定其中序遍歷序列,考慮如下圖中的幾棵二叉樹 所有這些二叉樹都有著相同...