【距离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) ...
var f:array[0..7,0..9] of longint; d:array[0..7] of longint; n,m:longint; function calc(x:longint):longint; var sum:longint; begin sum:=0; fillchar(d,sizeof(d),0); while x>0 do begin inc(sum); d[sum]:= x mod 10; x:= x div 10; end; calc:=sum; end; function solve(x:longint):longint; var ans,len,i,j,k:longint; begin ans:=0; len:=calc(x); for i:= len downto 1 do begin for j:= 0 to d[i]-1 do if (j<>4) and ((j<>2) or (d[i+1]<>6)) then ans:=ans+f[i,j]; if (d[i]=4) or ((d[i]=2) and (d[i+1]=6)) then break; end; solve:=ans; end; procedure init; var i,j,k:longint; begin f[0,0]:=1; for i:= 1 to 7 do for j:= 0 to 9 do for k:= 0 to 9 do if (j<>4) and ((j<>6) or (k<>2)) then f[i,j]:=f[i-1,k]+f[i,j]; end; Begin init; readln(n,m); while (n<>0) or (m<>0) do begin writeln(solve(m+1)-solve(n)); readln(n,m); end; End.