Wannafly挑戰賽22B 字元路徑(動態規劃)

2021-09-27 06:26:46 字數 1619 閱讀 7409

字元路徑

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

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

64bit io format: %lld

給乙個含n個點m條邊的有向無環圖(允許重邊,點用1到n的整數表示),每條邊上有乙個字元,問圖上有幾條路徑滿足路徑上經過的邊上的字元組成的的字串去掉空格後以大寫字母開頭,句號 '.' 結尾,中間都是小寫字母,小寫字母可以為0個。

第一行兩個整數n,m

接下來m行,每行兩個整數a,b和乙個字元c,表示一條起點為a,終點為b的邊,邊上的字元是c

1 ≤ n, m ≤ 50000

1 ≤ a < b ≤ n

c可以是大小寫字母、句號 '.' 或空格(方便起見用 '_' 表示空格)

輸出乙個整數,表示答案對232取模的結果
示例1

複製

6 11

1 2 a

1 2 _

3 4 _

2 4 b

2 3 a

2 3 _

2 4 b

4 5 .

3 5 .

2 5 .

5 6 _

複製

16
原本還想儲存到達點i的所有字元結尾的狀態,這樣寫好像也可以,但是還有更優秀的方法。表示到達i點結束,以空格為起點的路徑數

轉移就很好想了,**中給了注釋,可以更好的理解。

舉一反三,這裡還有一道差不多的狀態轉移,這種只記錄開始,中間和結尾的狀態比較常見,值得理解。

comet oj contest #8:

c題,也是差不多的思路

#includeusing namespace std;

#define rep(i,l,r) for(int i=l;i<=r;++i)

#define per(i,r,l) for(int i=r;i>=l;--i)

#define pb push_back

#define mk make_pair

#define ll long long

#define u32 unsigned int

const int maxn=5e4+10;

int n,m;

vector>g[maxn];

//空格開頭 1

//中間 2

//已經結尾 3

u32 dp[maxn][10];

signed main()

rep(i,1,n)

else if(sig=='_')

else if(sig<='z'&&sig>='a')

else dp[to][3]+=dp[i][2];//結尾狀態,為中間態+句號

} }u32 ans=0;

rep(i,1,n)ans+=dp[i][3];

cout<

return 0;

}

Wannafly挑戰賽22 D 整數序列

給出乙個長度為n的整數序列a1,a2,an,進行m次操作,操作分為兩類。操作1 給出l,r,v,將al,al 1,ar分別加上v 操作2 給出l,r,詢問 第一行乙個整數n 接下來一行n個整數表示a1,a2,an 接下來一行乙個整數m 接下來m行,每行表示乙個操作,操作1表示為1 l r v,操作2...

Wannafly挑戰賽5 B 數學規律

題目描述 這個比賽,歸根結底就是控制乙個虛擬的小拖拉機跑完整個賽道。一般一場比賽會有 9 個到 13 個賽道,最後看能跑完多少個賽道。通常在一場可程式設計拖拉機比賽中,分別會有實際參賽隊伍數 10 20 30 向下取整的隊伍獲得金 銀 銅牌,其餘隊伍獲得榮譽提名,俗稱 鐵牌 但是主辦方往往會多準備一...

Wannafly挑戰賽15 B 車輛安排

鏈結 題目描述 有n個隊伍,每個隊伍的人數小於等於5,每輛車最多坐5個人,要求乙個隊伍的人都在一輛車上,求最少的車數 輸入描述 第一行n 第二行n個數,表示每個隊伍的人數 輸出描述 輸出最少車數 示例1 輸入3 3 4 5 輸出 備註 n 1e5 每個數小於等於5 貪心 4個人的只能和1個人的拼車 ...