zoukankan      html  css  js  c++  java
  • 数位dp 模版

    1 int dfs(int i, int s, bool e) {
    2     if (i == -1) return s == target_s;
    3     if (!e && ~dp[i][s]) return dp[i][s];
    4     int res = 0;
    5     int u = e ? num[i] : 9;
    6     for (int d = first ? 1 : 0; d <= u; ++d)
    7        res += dfs(i-1, new_s(s, d), e&&d == u);
    8    return e ? res : dp[i][s] = res;
    9 }
    View Code

    其中:

    f为记忆化数组;

    i为当前处理串的第i位(权重表示法,也即后面剩下i+1位待填数);

    s为之前数字的状态(如果要求后面的数满足什么状态,也可以再记一个目标状态t之类,for的时候枚举下t);

    e表示之前的数是否是上界的前缀(即后面的数能否任意填)。

    for循环枚举数字时,要注意是否能枚举0,以及0对于状态的影响,有的题目前导0和中间的0是等价的,但有的不是,对于后者可以在dfs时再加一个状态变量z,表示前面是否全部是前导0,也可以看是否是首位,然后外面统计时候枚举一下位数。It depends.

    于是关键就在怎么设计状态。当然做多了之后状态一眼就可以瞄出来

    注意:

    不满足区间减法性质的话(如hdu 4376),不能用solve(r)-solve(l-1),状态设计会更加诡异。

    /*-------------------------------------------------------------------------*/

    hdu2089 不要62

    Hdu3555不能出现连续的49

    UESTC 1307相邻的数差大于等于2

    HDU 3652 出现13,而且能被13整除。

    HDU 3709 平衡数

    light OJ 1140两个数之间的所有数中零的个数。

    lightoj 1032  二进制数中连续两个‘1’出现次数的和

    Codeforces 55D. Beautiful numbers

    POJ 3252  Round Number (组合数)

    LightOJ 1068 能被K整数且各位数字之和也能被K整除的数

    LightOJ1205求区间[a,b]的回文数个数。

    hdu3886求满足符号串的数字个数。

    HDU4352严格上升子序列的长度为K的个数。

    ural 1057 数位统计

    codeforces215E周期数

    codeforces258B在1-m中任选7个数,要使前六个数字中的“4”,"7"之和小于第七个的,

    HDU4507 和7无关数的平方和

    Zoj2599 数位统计(见题意)

    zoj3162分形、自相似

    ZOJ3494 BCD Code(AC自动机+数位DP)

  • 相关阅读:
    java使用AES加密解密 AES-128-ECB加密
    快速集成iOS基于RTMP的视频推流
    iOS视频直播初窥:高仿<喵播APP>
    直播相关的开源库/项目
    iOS 常见 Crash 及解决方案
    命名规范
    实现UITableView循环利用
    最快让你上手ReactiveCocoa之进阶篇
    最快让你上手ReactiveCocoa之基础篇
    带你走进脚本世界,ijkplayer之【init-ios.sh】脚本分析
  • 原文地址:https://www.cnblogs.com/KimKyeYu/p/3413134.html
Copyright © 2011-2022 走看看