题目
思路
感觉是比较简单的一个数位dp(因为直接做习惯了?)
本质上还是单独把每一位拿出来,然后根据选0-an-1和只选an两种情况考虑:
1.选0-an-1的情况下:那么就要看上一位是否出现6,如果出现6那么下一位就不能选择2,否则就是0-9(不包括4)任意选择的情况。这里用f[i][j]代表一共有i位数最高位为j的情况的方案数,那么其实也很好处理:
for(int i =0;i<=9;i++)
if(i!=4)f[1][i]++;//特判,只有一位数并且不是4的每种方案数++
for(int i =2;i<N;i++)
for(int j =0;j<=9;j++)
for(int k=0;k<=9;k++)
{
if(j==4)break;
if(j==6&&k==2) continue;
f[i][j]+=f[i-1][k] ; //一共有i位且最高位为j的情况
}
2.然后是选右边的情况,那么就判断当前位是不是4或者上一位和当前位是否能构成62,如果是那么就直接退出循环就可以了,如果走到了最后一位,那么就说明这种方案数合法,直接res++即可。
ps:这篇题解我写的比较省略,重点还是把每一位分开然后根据树的思想然后分类讨论,看不懂的可以先去看第一篇,(这是第一个数位dp题解的图,就这么凑合用着 吧hh)