• Codeforces 914C Travelling Salesman and Special Numbers (数位DP)


    题意:题目中定义了一种运算,把数字x变成数字x的二进制位数。问小于n的恰好k次运算可以变成1的数的个数(题目中的n是二进制数,n最大到2^1000)

    思路:容易发现,无论多么大的数,只要进行了一次运算,一定会变成1000以内的数,所以我们可以预处理1000以内的数经过多少次运算到1。之后,我们可以枚举1000以内的数字,枚举有哪些数字是经过k - 1次运算到1(假设此时数字是i),那么小于n的位数为i的数字都是答案。怎么统计答案呢?我们用试填法。我们dfs中传入3个参数:deep(当前搜索到第几位), flag(判断后面的位可不可以随便填),remain(还剩多少位没有填)。我们判断第deep位可以填什么。如果n的第deep位是1,那么填1填0都可以,分别搜索。如果第deep位是0,那么只能填0。

    代码:

    #include <bits/stdc++.h>
    #define LL long long
    using namespace std;
    const LL mod = 1000000007;
    const int maxn = 1010;
    LL C[maxn][maxn];
    LL num[maxn];
    LL f[maxn][maxn];//i位,需要j步到1的 
    char s[maxn];
    LL ans;
    int n;
    void dfs(int deep, bool flag, int remain) {
    	if(n < remain) return;
    	if(remain == 0) {
    		ans = (ans + 1) % mod;
    		return;
    	}
    	if(deep < 1) return;
    	if(flag == 0) {
    		ans = (ans + C[deep][remain]) % mod;
    		return;
    	}
    	if(s[deep] == '1') {
    		dfs(deep - 1, 0, remain);
    		dfs(deep - 1, flag, remain - 1);
    	} else {
    		dfs(deep - 1, flag, remain);
    	}
    }
    int main() {
    	int m;
    	scanf("%s",s + 1);
    	scanf("%d", &m);
    	n = strlen(s + 1);
    	if(m == 0) {
    		printf("1
    ");
    		return 0;
    	} else if(m == 1) {
    		printf("%d
    ", n - 1);
    		return 0;
    	}
    	for (int i = 0; i <= n; i++) C[i][0] = 1;
    	for (int i = 1; i <= n; i++)
    		for (int j = 1; j <= i; j++) {
    			C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
    		}
    	reverse(s + 1, s + 1 + n);
    	for (int i = 2; i <= 1000; i++) {
    		int cnt = 0;
    		for (int j = i; j; j >>= 1) {
    			cnt += (j & 1);
    		}
     		num[i] = num[cnt] + 1;
    		if(num[i] + 1 == m)
    			dfs(n, 1, i);
    	}
    	printf("%lld
    ", ans);
    }
    

      

  • 相关阅读:
    基于GIS的生态环境信息一张图系统应用与研究
    基于GIS的开源社区(村)网格化数据管理平台
    智慧乡村综合解决方案数字化智能农业
    开源免费乡村振兴数字乡村平台
    Oracle连接字符串记录
    SqlLocalDB使用笔记
    Orchard分类Taxonomies图文教程
    自己手动maven命令将jar包安装到本地。
    Mysql如何去掉数据库中重复记录?
    常见的数据库方面问题
  • 原文地址:https://www.cnblogs.com/pkgunboat/p/10456299.html
Copyright © 2020-2023  润新知