码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj1566

时间:2015-06-30 18:09:23      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:

好题,这道题体现了换一个角度计数的思想

a1^2+a2^2+……ak^2=(变成第1种输出序列的操作序列数目)^2+(变成第2种输出序列的操作序列数目)^2……

脑洞大一点,这就相当于两个操作序列变成相同输出序列的对数(包括自己和自己)

于是dp即可……dp[i,j,k]表示输出到第i个,第一个操作序列在上面取了j个,第二个操作序列在上面取了k个,怎么弄大家都会……

技术分享
 1 const mo=1024523;
 2 
 3 var s1,s2:array[0..600] of char;
 4     p,m,n,i,j,k,j1,k1:longint;
 5     f:array[0..1,0..510,0..510] of longint;
 6 
 7 procedure reverse;
 8   var s:ansistring;
 9   begin
10     readln(s);
11     for i:=1 to n do
12       s1[n-i+1]:=s[i];
13     s1[n+1]:=$;
14     readln(s);
15     for i:=1 to m do
16       s2[m-i+1]:=s[i];
17     s2[m+1]:=#;
18   end;
19 
20 begin
21   readln(n,m);
22   reverse;
23   f[0,0,0]:=1;
24   for i:=1 to m+n do
25   begin
26     p:=1-p;
27     fillchar(f[p],sizeof(f[p]),0);
28     for j:=0 to n do
29       for k:=0 to n do
30         if f[1-p,j,k]>=mo then f[1-p,j,k]:=f[1-p,j,k] mod mo;
31     for j:=0 to n do
32       for k:=0 to n do
33       begin
34         j1:=i-1-j;
35         k1:=i-1-k;
36         if (j1>=0) and (k1>=0) and (j1<=m) and (k1<=m) then
37         begin
38           if s1[j+1]=s1[k+1] then inc(f[p,j+1,k+1],f[1-p,j,k]);
39           if s1[j+1]=s2[k1+1] then inc(f[p,j+1,k],f[1-p,j,k]);
40           if s2[j1+1]=s1[k+1] then inc(f[p,j,k+1],f[1-p,j,k]);
41           if s2[j1+1]=s2[k1+1] then inc(f[p,j,k],f[1-p,j,k]);
42         end;
43       end;
44   end;
45   writeln(f[p,n,n] mod mo);
46 end.
View Code

 

bzoj1566

标签:

原文地址:http://www.cnblogs.com/phile/p/4610999.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!