lightoj 1021 - Painful Bases(数位dp+状压)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1021

题解:简单的数位dp由于总共就只有16个存储一下状态就行了。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
ll dp[1 << 17][21] , po[20][20];
int base , k , num[20];
char s[20];
ll dfs(int len , int stat , int mod , int Max) {
    if(len == 0) {
        if(mod % k == 0) return 1;
        return 0;
    }
    if(dp[stat][mod] != -1) return dp[stat][mod];
    ll sum = 0;
    for(int i = 0 ; i < Max ; i++) {
        if((1 << i) & stat) continue;
        else {
            sum += dfs(len - 1 , stat | (1 << i) , (num[i] + mod * base) % k, Max);
        }
    }
    dp[stat][mod] = sum;
    return sum;
}
int main() {
    int t;
    scanf("%d" , &t);
    int ans = 0;
    for(int i = 2 ; i <= 16 ; i++) {
        po[i][0] = 1;
        for(int j = 1 ; j <= 16 ; j++) {
            po[i][j] = po[i][j - 1] * i;
        }
    }
    while(t--) {
        scanf("%d%d" , &base , &k);
        scanf("%s" , s);
        int len = strlen(s);
        for(int i = 0 ; i < len ; i++) {
            if(s[i] == ‘A‘) num[i] = 10;
            else if(s[i] == ‘B‘) num[i] = 11;
            else if(s[i] == ‘C‘) num[i] = 12;
            else if(s[i] == ‘D‘) num[i] = 13;
            else if(s[i] == ‘E‘) num[i] = 14;
            else if(s[i] == ‘F‘) num[i] = 15;
            else num[i] = s[i] - ‘0‘;
        }
        for(int i = 0 ; i < (1 << len) ; i++) {
            for(int j = 0 ; j <= k ; j++) dp[i][j] = -1;
        }
        printf("Case %d: %lld\n" , ++ans , dfs(len , 0 , 0 , len));
    }
    return 0;
}
时间: 2024-12-20 08:48:29

lightoj 1021 - Painful Bases(数位dp+状压)的相关文章

HDU 4352 XHXJ&#39;s LIS 数位DP + 状压

由LIS的nlogn解法 可以得出最后统计数组中数的个数即为LIS的长度 这样就可以状压了 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <c

HDU.4352.XHXJ&#39;s LIS(数位DP 状压 LIS)

题目链接 数位DP. 至于怎么求LIS,因为只有10个数,所以可以参照O(nlogn)求LIS的方法,状压记录状态. 每次加一个数和求LIS一样更新状态.最后状态中1的个数就是LIS的长度. //93MS 3004K #include <cstdio> #include <cctype> #include <cstring> #include <algorithm> #define gc() getchar() typedef long long LL; c

CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高位数字不为0. 因此,符合我们定义的最小的有趣的数是2013.除此以外,4位的有趣的数还有两个:2031和2301. 请计算恰好有n位的有趣的数的个数.由于答案可能非常大,只需要输出答案除以1000000007的余数. 输入格式 输入只有一行,包括恰好一个正整数n (4 ≤ n ≤ 1000). 输

SPOJ10606 BALNUM - Balanced Numbers(数位DP+状压)

Balanced numbers have been used by mathematicians for centuries. A positive integer is considered a balanced number if: 1)      Every even digit appears an odd number of times in its decimal representation 2)      Every odd digit appears an even numb

2017.8.15 [Haoi2016]字符合并 区间dp+状压dp

[题目描述] 有一个长度为n的01串,你可以每次将相邻的k个字符合并,得到一个新的字符并获得一定分数.得到的新字符和分数由这k个字符确定.你需要求出你能获得的最大分数. [输入格式] 第一行两个整数n,k. 接下来一行长度为n的01串,表示初始串.输入的的相邻字符之间用一个空格隔开. 接下来2k行,每行一个字符ci和一个整数wi,ci表示长度为k的01串连成二进制后按从小到大顺序得到的第i种合并方案得到的新字符, wi表示对应的第i种方案对应获得的分数. [输出格式] 输出一个整数表示答案. [

『字符合并 区间dp 状压dp』

字符合并 Description 有一个长度为 n 的 01 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数.得到的新字符和分数由这 k 个字符确定.你需要求出你能获得的最大分数. Input Format 第一行两个整数n,k.接下来一行长度为n的01串,表示初始串. 接下来2^k行,每行一个字符ci和一个整数wi,ci表示长度为k的01串连成二进制后按从小到大顺序得到的第i种合并方案得到的新字符,wi表示对应的第i种方案对应获得的分数. 1<=n<=300,0<

lightoj 1119 - Pimp My Ride(状压dp)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1119 题解:状压dp存一下车有没有被搞过的状态就行. #include <iostream> #include <cstring> #include <cstdio> using namespace std; typedef long long ll; ll dp[1 << 15] , val[15][15]; int main() {

HDU 5045 DP+状压

2014 ACM/ICPC Asia Regional Shanghai Online 给出N个人做M道题的正确率,每道题只能由一个人做出,并且当所有人都做出来且仅做出一道题时,做过题的人才可以继续做题,求最大期望. 一共只有10个人,状压存储每个人是否已经做出题目,如果都作出则状态清0: #include "stdio.h" #include "string.h" double Max(double a,double b) { if (a<b) return

BZOJ 2595: [Wc2008]游览计划 [DP 状压 斯坦纳树 spfa]【学习笔记】

传送门 题意:略 论文 <SPFA算法的优化及应用> http://www.cnblogs.com/lazycal/p/bzoj-2595.html 本题的核心就是求斯坦纳树: Steiner Tree: Given an undirected graph with non-negative edge weights and a subset of vertices, usually referred to as terminals, the Steiner tree problem in g