刪括號(判定性dp)

2021-09-25 20:37:43 字數 1360 閱讀 3604

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 524288k,其他語言1048576k

64bit io format: %lld

給你乙個合法的括號序列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: 無限制

先觀察這道題.題目所說的可刪的括號必須相鄰且"可動態",即((()()))在刪()()後,可繼續刪(),再刪().

如果一對()一對()dp的話,記錄每一對的位置及存在性會很麻煩,或許要2^50的複雜度,很明顯不行

不如用k = 刪掉的'('數 - 刪掉的')'數,當k = 0時,操作可行(因為有重要前提s1合法)

想到這裡思路就應該很清晰了:

菜雞只想到了模擬~~~

那個「合法」二字很重要,讀題的時候並沒注意

#includeusing namespace std;

typedef long long ll;

char a[105],b[105];

bool dp[105][105][55];

int main()

}} }

if(dp[la][lb][0]) printf("possible\n");

else printf("impossible\n");

return 0;

}

一二計畫(Day 2)DP 刪括號

題目 動態規劃要找對變數以及變數之間的關係 我們設定dp i j k 主要的變數就是計算多餘額外的左括號 表示a字串前i個刪除k個左括號構成b字串 關係為i與i 1之間的關係 詳見 include include int dp 110 110 110 dp i j k 表示a字串前i個刪除k個左括號...

刪括號 判斷可行性的dp

給你乙個合法的括號序列s1,每次你可以刪除乙個 你可以刪除0個或者多個 求能否刪成另乙個括號序列s2 輸入描述 第一行輸入乙個字串s 2 s 100 第二行輸入乙個字串t 2 t 100 輸出描述 如果可以輸出 possible 否則輸出 impossible 示例1 輸入複製 輸出 複製 poss...

牛客 刪括號

給你乙個合法的括號序列s1,每次你可以刪除乙個 你可以刪除0個或者多個 求能否刪成另乙個括號序列s2 第一行輸入乙個字串s 2 s 100 第二行輸入乙個字串t 2 t 100 如果可以輸出 possible 否則輸出 impossible possible possible impossible ...