【距离GDOI:141天】 滚入数位DP的坑
作为博客园的第一篇...我都不知道要写什么了 ...
其实今天很没状态,就当吐槽吧...
嗯,被黄神带去写treap+可持久化线段树,然后在可持久化的删除上面跪了两天,真的是一跪不起。我已经连续多久没有AC一道题了?有时候真心会觉得,学一些东西,到达差不多就应该先放手,一次性钻太深对自己没好处。其实之前到可持久化结束就可以结束了,还顺手搞掉配对堆和替罪羊,已经很不错了。这时候再来搞什么可持久化的加深...额有点感觉无效率。加上自己这两天社团有事,状态直接变成渣了...自己的错,都是蒟蒻的借口罢了。说好每天都要有一点小进步,哪去了...
数位DP
数位DP的概念在这个东西里面讲的很清楚
http://wenku.baidu.com/link?url=W07aYBvgLsyu3GYWWcBU0qrF88jn-hXXFzzjmLzEK7D2ZdEtl3lkAT9SlWNTJX_Q1FkH_BWIcDUM1vjgizIEliiJ1O6CK576ORA3o5Y8e6G
第一道题写的是HDU 2089,其实里面也讲了题解...然后,主要是别忘了在计算的时候,x本身没有被考虑,所以考虑区间的时候应该要 solve(m+1)-solve(n) ...
1 var 2 f:array[0..7,0..9] of longint; 3 d:array[0..7] of longint; 4 n,m:longint; 5 6 function calc(x:longint):longint; 7 var sum:longint; 8 begin 9 sum:=0; 10 fillchar(d,sizeof(d),0); 11 while x>0 do 12 begin 13 inc(sum); 14 d[sum]:= x mod 10; 15 x:= x div 10; 16 end; 17 calc:=sum; 18 end; 19 20 function solve(x:longint):longint; 21 var ans,len,i,j,k:longint; 22 begin 23 ans:=0; 24 len:=calc(x); 25 for i:= len downto 1 do 26 begin 27 for j:= 0 to d[i]-1 do 28 if (j<>4) and ((j<>2) or (d[i+1]<>6)) then ans:=ans+f[i,j]; 29 if (d[i]=4) or ((d[i]=2) and (d[i+1]=6)) then break; 30 end; 31 solve:=ans; 32 end; 33 34 procedure init; 35 var i,j,k:longint; 36 begin 37 f[0,0]:=1; 38 for i:= 1 to 7 do 39 for j:= 0 to 9 do 40 for k:= 0 to 9 do 41 if (j<>4) and ((j<>6) or (k<>2)) then f[i,j]:=f[i-1,k]+f[i,j]; 42 end; 43 44 Begin 45 init; 46 readln(n,m); 47 while (n<>0) or (m<>0) do 48 begin 49 writeln(solve(m+1)-solve(n)); 50 readln(n,m); 51 end; 52 End.