JSOI2017 Day1T3 code解题报告
via. HbFS-
观察语法规则可以发现
1、每个循环结束后寄存器的值是0
2、若当前寄存器值为0,则在后面添加一个循环,在循环内部添加任意能通过编译的程序,新程序都不会死循环
我们可以用动态规划求解这个问题
hi 表示长度为 i 能通过编译的程序数量
若
j≠0
fi,j=fi−1,j−1+fi−1,j+1+∑ik=2dk−1fi−k+∑ik=2(gk−2,j+fk−2,j)fi−k,0
否则:
fi,j=fi−1,j−1+fi−1,j+1+∑ik=2dk−1fi−k+∑ik=2hk−2fi−k,0
其中
gi,j
表示长度为
i
,运行结果为
Fi,j表示长度为i,寄存器初始值为0,运行结果为j的程序数量
若
j=0
Fi,j=Fi−1,j−1+Fi−1,j+1+∑ik=2dk−1Fi−k,j+∑ik=2∑l≠0(gk−2,j+fk−2,j)Fi−k,j+∑ik=2hk−2Fi−k,0
否则
Fi,j=Fi−1,j−1+Fi−1,j+1+∑ik=2dk−1Fi−k,j
ans=∑iFn,i