zoukankan      html  css  js  c++  java
  • HDU2089(数位dp)

    喜闻乐见的数位入门第一道,这个dp[pos][state]记录的是第pos位如果没有限制的话(有限制当然要搜一搜暴力数了),前一位 放6 or 不放6 的方案数。也就是并不是要求的答案,其实就是记忆化一下,减小搜索的复杂度,跟dp没啥关系吧……

     1 int n, m, cnt;
     2 ll a[10], dp[10][2];
     3 
     4 ll dfs(int pos, int pre, int state, int limit) {
     5     if (!pos)   return 1;
     6     if (!limit && dp[pos][state] >= 0)  return dp[pos][state];
     7 
     8     int up = limit ? a[pos] : 9;
     9     ll ret = 0;
    10     rep(i, 0, up) {
    11         if (i == 4 || (pre == 6 && i == 2)) continue;
    12         ret += dfs(pos - 1, i, i == 6, limit & (i == a[pos]));
    13     }
    14 
    15     if (!limit) dp[pos][state] = ret;
    16     return ret;
    17 }
    18 
    19 ll solve(int x) {
    20     for (cnt = 0; x; x /= 10)
    21         a[++cnt] = x % 10;
    22     return dfs(cnt, -1, 0, 1);
    23 }
    24 
    25 int main() {
    26     init(dp, -1);
    27     while (~scanf("%d %d", &n, &m) && (n | m)) {
    28         writeln(solve(m) - solve(n - 1));
    29     }
    30     return 0;
    31 }
  • 相关阅读:
    常建的性能指标
    性能测试常见分类
    性能测试相关概念和指标
    adb命令熟悉
    打包ajax生成小工具
    深入理解类加载demo
    设计模式七大原则
    javamail邮件实现
    @RequiredArgsConstructor用法
    spring-security查询数据库源码解析
  • 原文地址:https://www.cnblogs.com/AlphaWA/p/10647748.html
Copyright © 2011-2022 走看看