交通序列號 簡單DP

2021-07-14 11:07:52 字數 2514 閱讀 1567

【問題描述】

在一條筆直的道路上共有n個路口,每個路口處都有關於該條道路的通行的訊號燈。

顯然,訊號燈共有綠(g)、紅(r)、黃(y)三種顏色。

交通部門指出,當綠色訊號燈為奇數個,且紅色訊號燈為偶數個時,該條道路為「通暢的」。

現在交給你乙個任務:給定從第乙個路口到最後乙個路口的所有訊號燈的序列,計算出這個序列在「通暢的」道路的字典序中的序號。

【輸入格式】

第一行,正整數n (n <= 10^5);

第二行,乙個長度為n的序列(不含空格),其中第i個字母表示第i個路口訊號燈的狀態。

【輸出格式】

輸出這個序列在「通暢的」道路的字典序中的序號

(由於答案可能比較大,所以你只要輸出答案除12345的餘數即可。

注意,若此道路不通暢,請輸出」invalid」[不含雙引號])

【輸入樣例】

4 rgyr

【輸出樣例】

9 【樣例說明】

這20種通暢道路分別是(按字典序,此部分無須輸出)

gggy、ggyg、grry、gryr、gygg、

gyrr、gyyy、rgry、rgyr、rrgy、

rryg、rygr、ryrg、yggg、ygrr、

ygyy、yrgr、yrrg、yygy、yyyg

【資料規模】

對於40%的資料,n<=15;

對於70%的資料,n<=10^4;

對於100%的資料,n<=10^5。

一道簡單的dp題,我們用陣列f[i,j,k] 表示前面有i個字母,綠色和紅色的奇/偶性,轉移方程自不用說,再從第乙個字母開始列舉所求的字串對於每乙個字元尋找可能方案加入ans。

ac code

var

red,tot,green,i,j,k,n:longint;

map:array[0..100001,0..1,0..1]of longint;

a:array[0..100001]of char;

procedure dfs(a,b,c:longint);

begin

if (b=1) and (c=0) then tot:=(tot+map[a,0,0]) mod 12345

else if b=1 then tot:=(tot+map[a,0,1]) mod 12345

else if c=0 then tot:=(tot+map[a,1,0]) mod 12345

else tot:=tot+map[a,1,1];

// tot:=(tot+map[a,b,c]) mod 12345;

end;

begin

readln(n);

for i:=1 to n do begin

read(a[i]);

if a[i]='g' then inc(green);

if a[i]='r' then inc(red);

end;

readln;

if (green mod 2<>1) or (red mod 2<>0) then begin

writeln('invalid');

close(input);close(output);

halt;

end;

green:=0;

red:=0;

map[n,0,1]:=1;

map[n,1,0]:=1;

map[n,0,0]:=1;

for i:=n-1 downto 1 do begin

map[i,1,1]:=(map[i+1,1,0]+map[i+1,0,1]+map[i+1,1,1]) mod 12345;

map[i,1,0]:=(map[i+1,1,0]+map[i+1,0,0]+map[i+1,1,1]) mod 12345;

map[i,0,1]:=(map[i+1,0,0]+map[i+1,0,1]+map[i+1,1,1]) mod 12345;

map[i,0,0]:=(map[i+1,1,0]+map[i+1,0,0]+map[i+1,0,1]) mod 12345;

end;

for i:=1 to n do begin

if a[i]='g' then begin

inc(green);

end;

if a[i]='r' then begin

inc(red);

dfs(i+1,(green+1) mod 2,(red-1) mod 2);

end;

if a[i]='y' then begin

dfs(i+1,(green+1) mod 2,(red) mod 2);

dfs(i+1,(green) mod 2,(red+1) mod 2);

end;

end;

write((tot+1) mod 12345);

end.

imsi序列號 手機IMSI序列號

1級2014 06 25 回答 國際移動使用者識別碼 imsi international mobile subscriber identity 國際上為唯一識別乙個移動使用者所分配的號碼。從技術上講,imsi可以徹底解決國際漫遊問題。但是由於北美目前仍有大量的amps系統使用min號碼,且北美的m...

獲取CPU序列號,硬碟序列號,網絡卡mac位址

獲取cpu序列號,硬碟序列號,網絡卡mac位址 private string getmoc 獲取硬碟序列號 managementclass mchd new managementclass win32 logicaldisk managementobjectcollection mochd mchd...

讀取硬體序列號

using system using system.collections.generic using system.text using system.management namespace 讀取序列號 獲取硬碟序列號 string hdid managementclass cimobject1...