金字塔 題解報告

2022-04-28 20:48:14 字數 1400 閱讀 8887

題目傳送門

【題目大意】

整個金字塔為乙個有根樹結構,根結點為入口,每個結點塗有一種顏色。機械人從入口開始進行dfs,每經過乙個結點,它就會記錄這個結點的顏色,最後形成乙個序列,求對應這個序列可行的樹的結構種類數。

【思路解析】

對於序列s,若子串s[l~r]對應一棵子樹,則s[l+1]和s[r-1]是進入和離開時產生的。除此之外,[l,r]包含的每棵更深的子樹都對應著乙個子問題,會產生[l,r]中的一段,相鄰兩段之間還有途經樹根產生的乙個字元。因為[l,r]包含的子樹個數可能不止兩個,如果樸素地列舉子串s[l~r]劃分點的數量和所有劃分點的位置,那麼時間複雜度會很高。

那麼我們考慮換一種方法,只考慮子串s[l~r]的第一棵子樹是由哪一段構成的。列舉劃分點k,令子串s[l+1~k-1]構成[l,r]的第一棵子樹,s[k~r]構成[l,r]的剩餘部分(其他子樹)。如果k不同,那麼子串s[l+1~k-1]代表的子樹的大小也不同,所以不可能出現重複計算的結果,並且我們可以得到轉移方程(f[l][r]表示方案數):$$if(s[l]\ne s[r])\to f[l][r]=0$$

$$if(s[l]=s[r])\to f[l][r]=f[l+1][r-1]+\sum_f[l+1][k-1]*f[k][r]$$初始值:$\forall l\in [1,len(s)],f[l][l]=1$,其餘均為0。

目標:f[1][len(s)]

我們發現,對於方案計數類問題,通常乙個狀態的各個決策之間滿足「加法原理」,而每個決策劃分的幾個子狀態之間滿足「乘法原理」。在設計狀態轉移方程的決策方式與劃分方法時,乙個狀態的所有決策之間必須具有互斥性,才能保證不會重複。

【**實現】

1 #include2

#define rg register

3#define go(i,a,b) for(rg int i=a;i<=b;i++)

4#define back(i,a,b) for(rg int i=a;i>=b;i--)

5#define ll long long

6#define mem(a,b) memset(a,b,sizeof(a))

7using

namespace

std;

8const

int n=302;9

const

int mod=1e9;

10int

f[n][n];

11char

s[n];

12int work(int l,int

r)21

intmain()

**戳這裡

python 金字塔 Python金字塔

托倫,函式中有幾個小錯誤和乙個邏輯問題print y to a 請注意,此函式生成乙個以z開頭的字串,但您希望將字串以相反的方向連線,而您的另乙個函式print a to y 確實停止了 1位置 例如 還要注意,您需要新增新行字元 n 以獲得一些不錯的輸出。在 我的解決方案是 def print a...

字母金字塔(類同數字金字塔)

問題描述 讓程式要求使用者輸入乙個大寫字母,使用巢狀迴圈產生像下面這樣的金字塔圖案 aaba abcba abcdba abcdecba 演算法分析 每行包括三個部分內容 若干個空格 正序排列的字母 倒序排列的字幕。使用乙個外部迴圈來處理行,在每乙個行中使用三個內部迴圈 乙個處理空格,乙個以公升序列...

數字金字塔

觀察下面的數字金字塔。寫乙個程式來查詢從最高點到底部任意處結束的路徑,使路徑經過數字的和最大。每一步可以走到左下方的點也可以到達右下方的點。7 3 8 8 1 0 2 7 4 4 4 5 2 6 5在上面的樣例中,從7 到 3 到 8 到 7 到 5 的路徑產生了最大 多組輸入資料 第乙個行包含 r...