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

 

posted @ 2014-12-11 21:27  Ecsy  阅读(85)  评论(0编辑  收藏  举报