hdu 2089 不要62 数位dp

唉勤奋了一个晚上,终于get到了数位dp的正确姿势。

用f[i,j]来表示第i位为j时有多少个满足条件的数。

代码:

var
  i,j,k,n,m:longint;
  f:array[0..10,0..10] of longint;

function work(x:longint):longint;
var
  a1,i,j:longint;
  a:array[1..7] of longint;
begin
  //if x=0 then exit(0);
  work:=0;
  a1:=0;
  while x>0 do
  begin
    inc(a1);
    a[a1]:=x mod 10;
    x:=x div 10;
  end;
  a[a1+1]:=0;
  for i:=a1 downto 1 do
  begin
    for j:=0 to a[i]-1 do
      if (a[i+1]<>6)or(j<>2) then work:=work+f[i,j];
    if (a[i]=4)or(a[i]=2)and(a[i+1]=6) then break;
  end;
end;

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(k<>4)and((j<>6)or(k<>2)) then
          f[i,j]:=f[i,j]+f[i-1,k];
  readln(n,m);
  while m>0 do
  begin
    writeln(work(m+1)-work(n));
    readln(n,m);
  end;
end.


你可能感兴趣的:(hdu 2089 不要62 数位dp)