括號序列問題,往往就是把左括號看成+1,右括號看成-1,我們只需要保證任意乙個字首大於等於0,且總和為0,就代表是個合法括號序列了。
令\(f[i][j]\)表示當前到第\(i\)個字元,現在的字首和\(j\)。那麼分三種情況考慮。
若第\(i+1\)個字元是左括號,則能轉移到\(f[i+1][j+1]\)。
若第\(i+1\)個字元是右括號,則能轉移到\(f[i+1][j-1]\)。
若第\(i+1\)個字元是問號,則能轉移到\(f[i+1][j-1]\)與\(f[i+1][j+1]\)。
最終\(f[n][0]\)就是方案總數啦。
時間複雜度為\(o(n^2)\)。
優化:二維陣列一定會炸。。。。
那就。。。迴圈佇列!
我們發現每次到新的乙個 $i $,它只和 \(i-1\) 有關,所以 \(i-1\) 用過一次就可以銷毀了,不然也是佔空間
可以像這樣&1來實現迴圈利用
f[i & 1][0]=0
std
#includeusing namespace std;
typedef long long ll;
const ll mod=1e9+7;
int n;
int f[3005][3005];
char c[3005];
int main()
} if(c[i]=='h')
}if(c[i]=='h')
}if(c[i]=='c')
f[i&1][i]=f[(i-1)&1][i-1];
} }cout<
}
YCH的模擬賽 T3
暴搜或者字典樹,但是因為輸出所有的方案而不是方案數,不管什麼做法都逃不過輸出,所以都差不多 sol1 記憶化搜尋 當列舉方案時,f i 表示已經把字串的前i個字母都拼好的情況下有多少方案 考慮從第i 1個字元開始到j是乙個給定的單詞 如果有這樣的j的話就可以轉移 然後開乙個vector把每乙個狀態下...
4 21小A模擬賽 T1
description 乙個無限長的01 序列,初始全為0,每次選擇乙個區間 l,r 進行操作,有三種操作 1 l r 將 l,r 中所有元素變成1。2 l r 將 l,r 中所有元素變成0。3 l r 將 l,r 中所有元素異或上1。每次操作後詢問最左邊的0 在哪個位置。input format ...
11 12 模擬賽T1 加密
有一種不講道理的加密方法是 在字串的任意位置隨機插入字元。相應的,不講道理的解密方法就是從字串中恰好刪去隨機插入的那些字元。給定原文?和加密後的字串?求?有多少子串可以通過解密得到原文?輸入第一行包含乙個字串?第二行包含乙個字串?輸出一行,包含乙個整數,代表可以通過解密得到原文的?的子串的數量。ab...