1. 程式人生 > >洛谷 P3413 【萌數】

洛谷 P3413 【萌數】

敲完這篇題解,我就,我就,我就,嗯,好,就這樣吧。。。

思路分析:

首先我們要知道一個迴文串的性質——假如說一個[l-1,r+1]的串是迴文的,那麼[l,r]一定也是迴文的。

所以我們只要記錄前一個數和前前一個數就可以了,假如說當前數和他們(前一個數和前前一個數)當中的任意一個相等,那麼它就一定是一個萌數。

知道了這些我們就可以開始設計狀態了。

dp[pos][pre1][pre2]表示當前找到pos位,前一個數為pre1,前前一個數為pre2時的萌數個數。

程式碼實現:

var
    a:array[1..2000] of Integer;
    dp:array[1..2000
,0..9,0..9,0..1] of Int64; len,i:Longint; ans,oo,t:int64; l,r,st:ansistring; function dfs(pos,pre1,pre2,lead,flag,val:Longint):int64; var i,limit,x:Integer; res:int64; begin if pos>len then exit(val); if (pre2>=0)and(lead+flag=0)and(dp[pos][pre1][pre2][val]<>-1
) then dfs:=(dp[pos][pre1][pre2][val]) else begin if flag=1 then limit:=a[pos] else limit:=9; res:=0; for i:=0 to limit do begin if lead=1 then x:=-1 else x:=pre1; res:=(res+dfs(pos+1,i,x,ord((lead=1)and(i=0)),ord((flag=1)and(i=limit)),ord((val=1)or((i=pre1)and
(lead=0))or((i=pre2)and(lead=0)))))mod oo; end; if (pre2>=0)and(lead+flag=0) then dp[pos][pre1][pre2][val]:=res; dfs:=res; end; end; begin oo:=1000000007; readln(st); t:=pos(' ',st); l:=copy(st,1,t-1); len:=length(l); delete(st,1,t); for i:=1 to len do a[i]:=ord(l[i])-48; while i>0 do if a[i]>0 then begin dec(a[i]); break; end else begin a[i]:=9; dec(i); end; fillchar(dp,sizeof(dp),255); ans:=dfs(1,-1,-1,1,1,0); r:=st; len:=length(r); for i:=1 to len do a[i]:=ord(r[i])-48; ans:=((dfs(1,-1,-1,1,1,0)-ans)mod oo+oo)mod oo; writeln(ans); end.