洛谷 P1310 表示式的值 解題報告

2022-04-30 06:06:08 字數 1468 閱讀 6646

對於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 請問...