對於1 位二進位制變數定義兩種運算:
運算的優先順序是:
先計算括號內的,再計算括號外的。
「× 」運算優先於「⊕」運算,即計算表示式時,先計算× 運算,再計算⊕運算。
例如:計算表示式a⊕b × c時,先計算 b × c,其結果再與 a 做⊕運算。
現給定乙個未完成的表示式,例如_+(*),請你在橫線處填入數 0或者1 ,請問有多少種填法可以使得表示式的值為0 。
共 2 行。
第1 行為乙個整數l ,表示給定的表示式中除去橫線外的運算子和括號的個數。
第2 行為乙個字串包含l個字元,其中只包含』(』、』)』、』+』、』』這 4 種字元,其中』(』、』)』是左右括號,』+』、』』分別表示前面定義的運算子「⊕」和「×」。這行字元按順序給出了給定表示式中除去變數外的運算子和括號。
共1 行。包含乙個整數,即所有的方案數。注意:這個數可能會很大,請輸出方案數對 10007取模後的結果。
對於 20% 的資料有 0≤l≤10 。
對於 50% 的資料有 0≤l≤1,000 。
對於 70% 的資料有 0≤l≤10,000 。
對於 100% 的資料有 0≤l≤100,000 。
對於 50% 的資料輸入表示式中不含括號。
這題我搞了三個小時(太菜了)
把先前的錯誤思路統計一下把。
wrong solution1:中綴轉字尾,按順序作dp。發現破壞了式子的性質,得了30分
wrong solution2:棧模擬,同時儲存符號和數字,遇到乘號就做(我可能忘記了括號emmmm),50分
正解:棧模擬,同時儲存括號和數字,將符號和數字交替插入(兩個左括號間不加),遇到右括號求解只含「+」和「*」的式子,求解方法同wrong solution2。記得多模以免爆精度。
公式自己手推一下應該不算難,注意細節。
還有一種做法是笛卡爾樹建樹+樹形dp
code:
#include const int n=100010;
const int mod=10007;
int tot,tot2,n;
struct node
s[n],s2[n];
char c[n];
void add()
void put(char cha)
void get()
else
tot--;
}s[tot].ans[1]=s2[1].ans[1];
s[tot].ans[0]=s2[1].ans[0];
for(int i=2;i<=tot2;i++)
s[tot].c=0;
}void work()
else
}}int main()
洛谷 P1310 表示式的值(棧 DP)
首先因為有優先順序和括號,可以先把表示式化成字尾表示式的形式,其中用 表示這乙個點是數字。用u記錄得到0的方案數,v記錄得到1的方案數。設兩個步驟的運算結果經過每個符號到乙個結果時,第乙個運算結果算出0的方案數為t1,1的方案數為t2。第二個算出0的方案數為t3,算出1的方案數為t4。則有 當符號是...
P1310 表示式的值
原題鏈結 water lift 一波講解,然後我們就會了這個題,然後我們就要寫部落格啦qwq 這是個布林表示式基計數問題。這個其實 就是 或運算,就是 與運算。我們將這個式子通俗得看成 x y 和 x y 我們設x0是使x為0的方案數,x1是使x為1的方案數 y0是使y為0的方案數,y1是使y為1的...
資料結構 P1310 表示式的值
題目鏈結 對於1 位二進位制變數定義兩種運算 運算的優先順序是 先計算括號內的,再計算括號外的。運算優先於 運算,即計算表示式時,先計算 運算,再計算 運算。例如 計算表示式a b c時,先計算 b c,其結果再與 a 做 運算。現給定乙個未完成的表示式,例如 請你在橫線處填入數字00或者11 請問...