題目描述
給你乙個合法的括號序列s1,每次你可以刪除乙個"()"
你可以刪除0個或者多個"()"
求能否刪成另乙個括號序列s2
輸入描述:
第一行輸入乙個字串s (2 ≤ |s| ≤ 100)
第二行輸入乙個字串t (2 ≤ |t| ≤ 100 )
輸出描述:
如果可以輸出"possible"
否則輸出"impossible"
示例1輸入
複製(())
()輸出
複製possible
示例2輸入
複製()
()輸出
複製possible
示例3輸入
複製(()()())
((()))
輸出複製
impossible
示例4輸入
複製((())((())())())
(()(())())
輸出複製
possible
示例5輸入
複製((())((())())())
((()()()()()))
輸出複製
impossible
備註:子任務1: |s| <= 10
子任務2: |s| <= 20
子任務3: 無限制
我們先談談簡單的思路,最內層的迴圈是為了找到乙個e使s能夠刪除e個『( 』 能與t匹配【e = 『(』 - 『)』 的數目】,所謂的匹配就是s和t相差n個();知道了這個以後我們就要對s和t進行動態維護;
我們先假定t 取前i項不動,對s進行動態處理,每次都增加s的一項,我們要判斷s的前j項和t的前i項能否通過處理e值來匹配,如果可以我們就稱之為可能達到目標的狀態,我們要用動態方程1
if(s[q+1]==』(』 ) dp[q+1][w][e+1]=true;
else if(k) dp[q+1][w][e-1]=true;
隨後我們要變動t,每次增一下,當然這種增加也不是隨便能增的,我們必須在上面所說的狀態為true時判斷,其中是否有一種情況能滿足e=0,且s[q+1]=t[w+1]?為什麼這樣做就是對的呢,我們回到我們剛剛開頭的地方,當dp[0][0][0]=true時對於s[q+1]和t[w+1]而言他們滿足我們上述所說的方程,我們每動一次t就是不斷擴大我們的子問題,保證在t增加的時候我們當前獲得的s,t子串能夠能夠通過刪除n個()來匹配;這裡我們就明白了,該題題意所要求問題的解答的一般情況是s刪n個()能與t匹配,想想是不是。
所以我們通過這三個判斷式能獲得所有的一般解,當然滿足s和t是括號序列的特殊情況就包含在內了;
以下是**提供參考
//注意dp[q][w][e]=true是指s前q項與t前w項能通過刪除e個多餘 '( '實現匹配;所以我們輸入時一定要注意 從陣列第1項開始輸入,切記不要從0項開始輸入,因為s[0]是s的第一項,而dp[0]表示s的前0項…;
#include
using
namespace std;
intmain()
}}}if
(dp[len1]
[len2][0
]) cout<<
"possible"
"impossible"
}
牛客 刪括號
給你乙個合法的括號序列s1,每次你可以刪除乙個 你可以刪除0個或者多個 求能否刪成另乙個括號序列s2 第一行輸入乙個字串s 2 s 100 第二行輸入乙個字串t 2 t 100 如果可以輸出 possible 否則輸出 impossible possible possible impossible ...
牛客 21303 刪括號
給你乙個合法的括號序列s1,每次你可以刪除乙個 你可以刪除0個或者多個 求能否刪成另乙個括號序列s2 第一行輸入乙個字串s 2 s 100 第二行輸入乙個字串t 2 t 100 如果可以輸出 possible 否則輸出 impossible possible possible impossible ...
牛客網 刪數
有乙個陣列a n 順序存放0 n 1,要求每隔兩個數刪掉乙個數,到末尾時迴圈至開頭繼續進行,求最後乙個被刪掉的數的原始下標位置。以8個數 n 7 為例 0,1,2,3,4,5,6,7 0 1 2 刪除 3 4 5 刪除 6 7 0 刪除 如此迴圈直到最後乙個數被刪除。輸入描述 每組資料為一行乙個整數...