NOIP模擬題 括號序列

2021-08-09 16:53:15 字數 2329 閱讀 4362

題目描述

課堂上,felix 剛剛學習了關於括號序列的知識。括號序列是乙個只由左括號「(」

和右括號「)」構成的序列; 進一步的, 乙個合法的括號序列是指左括號和右括號能

夠 一一匹配的序列。

如果用規範的語言說明,乙個合法的括號序列可以有以下三種形式:

1 s=「」(空串) ,s 是乙個合法的括號序列;

2 s=xy,其中 x,y 均為合法的括號序列,則 s 也是乙個合法的括號序列;

3 s=(x),其中 x 為合法的括號序列,則 s 也是乙個合法的括號序列。

這時老師在黑板上寫出了乙個了括號序列:「()))()」。

felix 一眼就看出這個序列並不是合法的括號序列。

這時老師提出了乙個這樣的問題:能否在序列中找出連續的一段,把這一段裡面

的左括號變成右括號,右括號變成左括號,變換之後整個序列可以變成合法的呢?

felix 想到,可以把[3..5]進行調換,這樣序列就會變為()(()),是乙個合法的序列。

很明顯,不止有一種方法可以使整個序列變合法。

這時,老師又在黑板上寫出了乙個長度為 n 的括號序列。felix 想,能否對這個

序列進行至多一次變換,使它變合法呢?

輸入 第一行乙個整數 t,代表資料的組數;接下來 t 行,每一行一組資料。

每組資料一行,代表給出的括號序列。

輸出 輸出共 t 行,對於每組資料,輸出「possible」(可以變換)或「impossible」(不可變

換) 。 (不含引號)

樣例 3

()))

)))(

() possible

impossible

possible

資料範圍

對於 50%的資料,t<=5, n<=20;

對於 100%的資料,t<=10, n<=5000.

50分:暴力列舉改變的區間,然後再o(n)判斷。

100分:dp,如果是左括號,a[i]=1 , 右括號 , a[i]=-1

對於 100% 的資料,需要使用動態規劃解決。注意到一次變換操作

把序列劃分成三段,前段與後段都沒有修改。

所以我們可以使用動態規劃:設 f[i][j][k] 為決定到前 i 位,目前的前

綴和為 j,並且現在第 i 位處於第 k 段(0 代表前,1 代表中,2 代

表後) ,是否可能。

dp 的轉移方程為新增一位 i+1;i+1 位可以仍然與第 i 位位於同一段,

也可以位於不同的一段。最後的結果就是看 f[n][0] 是否可能。

時間複雜度:o(n^2*3)

50分

#include

#include

#include

#include

#define ll long long

#define i "impossible\n"

#define p "possible\n"

using

namespace

std;

int n,s[5009],sl[5009],sr[5009],len;

char c[5009];

bool check()

return sl[len]==sr[len];

}int main()

for(int k=i;k<=j;k++) s[k]^=1;

}if(flag) break;

}if(!flag) printf(i);

}return

0;}

100分

#include

#include

#include

#include

#define ll long long

#define i "impossible\n"

#define p "possible\n"

using

namespace

std;

int n,t;

char s[5009];

int f[2][5009][3],a[5009];

void solve()

if(f[now^1][j][1])

if(f[now^1][j][2])

}now^=1;

}now^=1;

for(int i=0;i<3;i++)

if(f[now][0][i])

printf(i);

}int main()

solve();

}return

0;}

NOIP模擬題 子串行

描述 給定3個字串,求它們的最長公共子串行。輸入 第一行乙個整數n,表示三個字串的長度 接下來三行,每行是乙個長度為n只包含小寫字母的字串。輸出 輸出最長公共子串行的長度。輸入樣例 4abac abbc cbca 輸出樣例 2提示 30 n 10 100 n 120 三維dp,道理和兩個字串的lcs...

NOIP模擬 序列

問題描述 乙個序列被稱為有趣的序列是它的所有的子串擁有乙個唯一的整數 這個整數在整個序 列中只出現過一次 給你乙個序列的整數,問你它是否是有趣的。輸入格式 第一行 t,表示資料組數。接下來每組資料第一行乙個 n。接下來是 n 個整數,均小於 10 9。輸出格式 輸出 boring 或者 non bo...

NOIP模擬 序列操作

2017.11.06t2 好氣,我這道題寫的權值線段樹,結果維護的時候搞忘清零了,只有 20 分,加上清零就 a了,當然我是指的評測機上ac,在 oj 上要 t 一些點,有點小氣。我用權值線段樹,在修改的時候加了乙個 lo g2h 但我的詢問是 lo g2h 的,比較已經過了的 修改是 o h 詢問...