jzoj5804】的更多相关文章

這道題n-m很小,可以從此入手 記f[i][j]為i個字符括號綜合為j的合法方案數 則第i個括號可以枚舉為(和),所以f[i][j]=f[i-1][j-1]+f[i-1][j+1],小心越界 再記a為序列總和,b為序列中前綴和最小值 則我們可以枚舉i,j統計答案,設前面括號的長度和權值為i,j 那麼中間的長度和權值為m,a,所以後面為n-m-i,-j-a 但是這樣子做會越界,我們可以考慮將所有後面的方案翻轉(左括變右,右括變左),方案合法,權值變負 這樣子,後面方案為n-m-i,j+a,所以不會…
性质:每个位置的前缀和必须大于0,总和=0.以此dp即可. #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int mod=1e9+7; int n,m,f[2005][2005],ans,sum,mn=0x3f3f3f3f; char s[100005]; int main() { freopen("bracket.in",&qu…