首页 > 其他分享 >一本通数位DP小结(更新中)

一本通数位DP小结(更新中)

时间:2022-10-14 21:11:09浏览次数:74  
标签:10 last int res ++ num 小结 DP 数位

「一本通 5.3 例 1」Amount of Degrees

点击查看代码
// 先转化为前缀和
// 从头到尾枚举每一位: 这一位的贡献为前面的位都相同, 这一位比原来更小, 后面的位任意的方案书
#include <vector>
#include <stdio.h>
#include <string.h>
int k, b;
int C[35][35]; // 组合数
int dp(int n) {
	if(!n) return 0;
	std::vector<int> num;
	while(n) num.push_back(n % b), n /= b;
	n = num.size();
	int res = 0, last = 0; // res 为答案, last 为当前 1 的个数
	for(int i = n - 1; i >= 0; i --) {
		int x = num[i];
		if(x) { // 这一位非0: 可以选择
			res += C[i][k - last]; // 这一位填0的情况(假设前面若干位都是)
			if(x > 1) { // 这一位可以尝试填1
				if(k - last - 1 >= 0) res += C[i][k - last - 1];
				break; // 由于只能填0或1,则
			} else // 只能选0: 如果1过多,跳过
				if(++ last > k) break;
		}
		if(!i && last == k) res ++; // 最后一位的贡献
	}
	return res;
}
int main() {
	int l, r; scanf("%d%d%d%d", &l, &r, &k, &b);
	for(int i = 0; i <= 34; i ++) {
		C[i][0] = 1;
		for(int j = 1; j <= i; j ++)
			C[i][j] = C[i-1][j] + C[i-1][j-1];
	}
	printf("%d\n", dp(r) - dp(l - 1));
	return 0;
}

「一本通 5.3 例 2」数字游戏

点击查看代码
#include <vector>
#include <stdio.h>
#include <string.h>
int f[15][10]; // 共有 i 位, 最高位为 j 的答案
int dp(int n) {
    if (!n)
        return 1; // 0满足条件

    std::vector<int> num;

    while (n)
        num.push_back(n % 10), n /= 10;

    int res = 0, last = 0; // last 为上一位

    for (int i = num.size() - 1; i >= 0; i --) {
        int x = num[i];

        for (int j = last; j < x; j ++)
            res += f[i + 1][j]; // 第i位填 j, 后面的随便填

        if (x < last)
            break; // 不能够保留

        last = x;

        if (!i)
            res ++; // 0满足条件
    }

    return res;
}
int main() {
    for (int i = 0; i < 10; i ++)
        f[1][i] = 1;

    for (int i = 2; i < 15; i ++)
        for (int j = 0; j < 10; j ++)
            for (int k = j; k < 10; k ++)
                f[i][j] += f[i - 1][k];

    int l, r;

    while (scanf("%d%d", &l, &r) == 2)
        printf("%d\n", dp(r) - dp(l - 1));

    return 0;
}


「一本通 5.3 例 3」Windy 数

点击查看代码
#include <math.h>
#include <vector>
#include <stdio.h>
#include <string.h>
int f[15][10]; // 总共 i 位数, 首位为 j 的方案数
int dp(int n) {
    if (!n)
        return 0; // 0不算

    std::vector<int> num;

    while (n)
        num.push_back(n % 10), n /= 10;

    int res = 0, last = -2;

    for (int i = num.size() - 1; i >= 0; i --) {
        int x = num[i];

        for (int j = (i == num.size() - 1); j < x; j ++) // 首位不能是0
            if (abs(j - last) >= 2)
                res += f[i + 1][j]; // 可以选的位

        if (abs(x - last) >= 2)
            last = x;
        else
            break; // 填不下去了

        if (!i)
            res ++; // 0结尾
    }

    for (int i = 1; i < (int)num.size(); i ++)
        for (int j = 1; j < 10; j ++)
            res += f[i][j]; // 位数不足的

    return res;
}
int main() {
    for (int i = 0; i < 10; i ++)
        f[1][i] = 1;

    for (int i = 2; i < 15; i ++)
        for (int j = 0; j < 10; j ++)
            for (int k = 0; k < 10; k ++)
                if (abs(j - k) >= 2)
                    f[i][j] += f[i - 1][k];

    int l, r;
    scanf("%d%d", &l, &r);
    printf("%d\n", dp(r) - dp(l - 1));
    return 0;
}

标签:10,last,int,res,++,num,小结,DP,数位
From: https://www.cnblogs.com/azzc/p/16793038.html

相关文章

  • Wireshark Lab: UDP v7.0
    0.实验文件地址http://www-net.cs.umass.edu/wireshark-labs/Wireshark_UDP_v7.0.pdf为什么UDP提供了检验和:不能保证源和目的之间的所有链路都提供差错检测(端到端原......
  • 单机安装基于LNMP结构的WordPress网站
    单机安装基于LNMP结构的WordPress网站基本环境准备配置nginx配置数据库服务器部署wordpressweb与数据库服务分离准备数据库服务器单机安装基于LNMP结构的WordPress网......
  • 动态轮播图展示GDP随时间迁移变化
    数据结果在时间分布上是如何迁移的?这里优先使用轮播图,也就是在图表中增加一条时间轴,让变量随着这条时间轴动态变化,例如历年人口数随时间的变化情况,各国GDP随时间的增长变化......
  • 期望计数类 $dp$
    整合了一下期望、计数类的\(dp\)。期望计数\(dp\)\(\rmNOIP\2021\)数列\(10.5\)模拟赛\(T2\)|CF1515E\(9.23\)模拟赛\(T1\)(orzzy)\(\rmNOIP\2016\)换......
  • leetcode-62. 不同路径 初级dp
    62.不同路径首先,机器人每次走路只能向下或者向右走一步根据网格是m*n,初始化动态规划数组,dp[m][n],那么如果机器人走到i,j位置,有多少种情况呢?首先分成子问题,机器人怎么走......
  • 动手动脑--多态小结
      通过在编程中应用多态,可以使我们的代码具有更强的适用性。当需求变化时,多态特性可以帮助我们将需要改动的地方减少到最低限度。多态编程有两种主要形式:(1)继承多态:示......
  • star MST (dp)
    题目大意:给你一个全连接的图,边权为1-k,然你构造出一个,图使得1到其他节点的菊花图,为最小生成树.问有多少种思路:先考虑如何构造.反向思考,此时这个菊花图......
  • For gamers. BY GAMERS (dp预处理+二分)
    题目大意:给出n个类型的魔法,每个魔法需要可以给敌人造成伤害,给自己弄血,但是需要花费Ci,给你X个金币,询问m次,  给出怪兽的血和攻击,问最少许需要多少金币才......
  • TCP与UDP的优缺点
    UDP:    特征:是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息。     优点:UDP速度快、操作简单、要求系统资源较少,由于通讯不需要连接,可以实现......
  • 状压DP
    [POI1997]Genotype题目背景Genotype是一个独特的基因串。题目描述我们可以用大写英文字母$A-Z$来描述Genotype,每个字母就代表一个基因。规定一种「分裂」规则,由......