這裡有乙個關於合法的括號序列的問題。
如果插入「+」和「1」到乙個括號序列,我們能得到乙個正確的數學表示式,我們就認為這個括號序列是合法的。例如,序列"(())()","()"和"(()(()))"是合法的,但是")(", "(()"和"(()))("是不合法的。我們這有一種僅由「(」,「)」和「?」組成的括號序列,你必須將「?」替換成括號,從而得到乙個合法的括號序列。
對於每個「?」,將它替換成「(」和「)」的代價已經給出,在所有可能的變化中,你需要選擇最小的代價。
input
第一行是乙個非空的偶數長度的字串,它僅由「(」,「)」和「?」組成。它的長度不大於 50000。接著是m行,m是字串中「?」的個數。每一行包含兩個整數 ai和bi ( 1<=ai,bi<=1000000), ai是將第i個「?」替換成左括號的代價, bi是將第i個「?」替換成右括號的代價。output
在一行中輸出合法的括號序列的最小代價。input示例如果沒有答案,輸出-1。
(??)output示例1 22 8
4#include #include #include #include using namespace std;
typedef long long int ll;
const int maxn = 50050;
char input[maxn];
ll a[maxn], b[maxn];
int main()
} priority_queue, greater> q;
ll sum = 0;
ll pos = 0;
for (int i = 0; i < len; i++)
else if (input[i] == ')')
else
if (sum < 0)
else
}} if (sum != 0)
else
return 0;
}
最小代價樹
題目 描述以下方法稱為最小代價的字母樹 給定一正整數序列,例如 4,1,2,3,在不改變量的位置的條件下把它們相加,並且用括號來標記每一次加法所得到的和。例如 4 1 2 3 5 5 10。除去原數不4,1,2,3之外,其餘都為中間結果,如5,5,10,將中間結果相加,得到 5 5 10 20,那麼...
最小編輯代價
對於兩個字串a和b,我們需要進行插入 刪除和修改操作將a串變為b串,定義c0,c1,c2分別為三種操作的代價,請設計乙個高效演算法,求出將a串變為b串所需要的最少代價。給定兩個字串a和b,及它們的長度和三種操作代價,請返回將a串變為b串所需要的最小代價。保證兩串長度均小於等於300,且三種代價值均小...
最小編輯代價
給定兩個字串str1和str2,再給定三個整數ic,dc和rc,分別代表插入 刪除和替換乙個字元的代價,請輸出將str1編輯成str2的最小代價。輸出三行,第一行和第二行均為一行字串,分別表示兩個字串str1,str2。left 1 leq length str1 length str2 leq 5...