【距离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.
View Code

 

posted @ 2014-12-11 21:34  Ecsy  阅读(181)  评论(1编辑  收藏  举报