LightOJ 1021 Painful Base(状压DP)

原创 2015年11月19日 17:15:15

题意:对一个base进制数,给出它可以包含的数字,对这个数进行全排列,问多少种可以整除k。

思路:base不超过16,看到这个数据量可以想到状压,再联系数位DP。得到转移方程dp[i][nmod] += dp[i - (1<<j)][mod],i表示当前状态,其中i & (1 << j);nmod = mod * base + num[j]。然后进行刷表

#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <string>
#include <queue>
#include <stack>
#include <cmath>
#include <set>
#include <map>
using namespace std;

typedef long long LL;
#define mem(a, n) memset(a, n, sizeof(a))
#define rep(i, n) for(int i = 0; i < (n); i ++)
#define REP(i, t, n) for(int i = (t); i < (n); i ++)
#define FOR(i, t, n) for(int i = (t); i <= (n); i ++)
#define ALL(v) v.begin(), v.end()
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define pb push_back
#define eps 1e-8
const int inf = 0x3f3f3f3f, N = 20, MOD = 1e9 + 7;

int T, cas = 0;
int n, m;
int base, k, num[N];
LL dp[1 << 17][20];
char str[N];

int main(){
#ifdef LOCAL
    freopen("/Users/apple/input.txt", "r", stdin);
//	freopen("/Users/apple/out.txt", "w", stdout);
#endif
	
    si(T);
    while(T --) {
    	sii(base, k);
    	scanf("%s", str);
    	for(int i = 0; i < base; i ++ ) {
    		if(str[i] <= 'F' && str[i] >= 'A') num[i] = str[i] - 'A' + 10;
    		else num[i] = str[i] - '0'; 
    	}
    	mem(dp, 0);
    	n = strlen(str);
    	int all = (1 << n) - 1;	
    	dp[0][0] = 1;

    	for(int i = 1; i <= all; i ++) {
    		for(int j = 0; j < n; j ++) {
    			if(i & (1 << j)) {
    				int s = i - (1 << j);
    				for(int mod = 0; mod < k; mod ++) {
    					int nmod = (mod * base + num[j]) % k;
    					dp[i][nmod] += dp[s][mod];
    				}
    			}
    		}
    	}
    	printf("Case %d: %lld\n", ++ cas, dp[all][0]);
    }
    
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

状态压缩dp入门 (poj3254 Corn Fields)

题目链接:http://poj.org/problem?id=3254 题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多...
  • y990041769
  • y990041769
  • 2014年04月28日 19:10
  • 18944

TSP问题之状态压缩dp法

动态规划的状态有时候比较难,不容易表示出来,需要用一些编码技术,把状态压缩,用简单的方式表示出来。典型方式就是当需要表示一个集合有哪些元素时,往往利用2进制用一个整数表示。一般数据n...
  • qq_32400847
  • qq_32400847
  • 2016年07月03日 10:44
  • 2018

状态压缩DP与TSP问题

状态压缩DPDP过程中的状态不可能像背包问题一样只有整数,肯定有各种各样稀奇古怪的状态,需要不止一个变量来表示。这种情况下如果需要使用DP 就必须把状态压缩成一个数来表示,并且一个数只能对应于一种状态...
  • Area_52
  • Area_52
  • 2015年05月25日 10:58
  • 1525

Lightoj 1021 Painful Bases (状压dp 有趣)

Lightoj 1021 Painful Bases (状压dp 有趣)
  • Tc_To_Top
  • Tc_To_Top
  • 2015年11月23日 17:22
  • 610

LightOJ1021---Painful Bases (状压dp)

As you know that sometimes base conversion is a painful task. But still there are interesting facts ...
  • Guard_Mine
  • Guard_Mine
  • 2015年06月09日 20:24
  • 916

LightOJ 1021 Painful Bases 【状压DP+数位DP】

题目链接题意求由一些B进制的数的全排列中能被K整除的数的个数分析题中B最高达到16,直接枚举排列显然不可能。考虑数位DP,但同时取得每个数要不同,所以需要记录用过哪些数,因此要用到状压DP状态dp[S...
  • DrCarl
  • DrCarl
  • 2016年08月04日 18:21
  • 156

Light 1021 - Painful Bases (状压dp)

RT
  • u014247806
  • u014247806
  • 2015年06月03日 21:55
  • 308

lightoj1021 Painful Bases【数位dp】

传送门:lightoj 1021题意: t组数据,每组给定进制base(2
  • lhfl911
  • lhfl911
  • 2016年09月08日 11:28
  • 165

lightoj 1021 从当前转移到其他状态的状压dp

As you know that sometimes base conversion is a painful task. But still there are interesting facts ...
  • NineFailure
  • NineFailure
  • 2016年10月11日 14:18
  • 138

LightOJ - 1021 :Painful Bases

LightOJ - 1021 :Painful Bases As you know that sometimes base conversion is a painful task. But sti...
  • Mitsuha_
  • Mitsuha_
  • 2017年08月04日 16:11
  • 192
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LightOJ 1021 Painful Base(状压DP)
举报原因:
原因补充:

(最多只允许输入30个字)