UVA 12063 Zeros and Ones(三维dp)
题意:给你n、k,问你有多少个n为二进制的数(无前导零)的0与1一样多,且是k的倍数
题解:对于每个k都计算一次dp,dp[i][j][kk][l]表示i位有j个1模k等于kk且第一位为l(0/1)
再次预处理mod[i][j]表示1的i次方模j等于几,具体看代码注释
import java.util.Scanner;
public class Main{
static int Maxn=65;
static int Maxk=101;
//前i个数有j个1模给定的值余k且第一位为1或者0的总个数
static long[][][][] dp = new long[Maxn][Maxn][Maxk][2];
//初始化1的i次方模j等于几
static int[][] Mod=new int[Maxn][Maxk];
//初始化
static void Init(){
for(int i=0;i<Maxn;++i){
for(int j=1;j<Maxk;++j){
Mod[i][j]=(int) ((1L << i)%j);
}
}
}
//按位dp求出当有n位是模kk等于0的总个数
static long Solve(int n,int kk){
if(kk==0||(n&1)==1)//特判
return 0L;for(int i=0;i<=n;++i)//初始化
for(int j=0;j<=i;++j)
for(int k=0;k<=kk;++k){
dp[i][j][k][0]=dp[i][j][k][1]=0L;
}
dp[0][0][0][0]=1L;
//每种dp的i位只与i-1位相关
for(int i=1;i<=n;++i){
//求i位有i/2个1时需要i-1位有i/2与i/2-1个1,但是再向前推就需要更多所以将出现所有可能个1的情况求出
for(int j=0;j<=i&&j<=n/2;++j){
//模kk等于所有k的情况都需要求出,用于下一次使用
for(int k=0;k<kk;++k){
//此位置放0
dp[i][j][k][0]+=dp[i-1][j][k][0]+dp[i-1][j][k][1];
//此位置放1,k就等于前一个是当前位置减去(1<<i-1)后再模kk的值
if(j>0){
dp[i][j][k][1]+=dp[i-1][j-1][(k+kk-Mod[i-1][kk])%kk][0]+dp[i-1][j-1][(k+kk-Mod[i-1][kk])%kk][1];//计算余数
}
}
}
}
return dp[n][n/2][0][1];
}
public static void main(String[] args) {
int t,coun=0;
int n,k;
Init();
Scanner sc =new Scanner(System.in);
t=sc.nextInt();
while(t!=0){
n=sc.nextInt();
k=sc.nextInt();
System.out.println("Case "+(++coun)+": "+Solve(n,k));
t--;
}
}
}
UVA 12063 Zeros and Ones(三维dp)的更多相关文章
- UVA 12063 Zeros and Ones
https://vjudge.net/problem/UVA-12063 题意: 统计n为二进制数中,0和1相等且值为m的倍数的数有多少个 dp[i][j][k] 前i位二进制 有j个1 值模m等于k ...
- UVA 12063 Zeros and ones 一道需要好好体会的好题
#include<bits/stdc++.h> #include<stdio.h> #include<iostream> #include<cmath> ...
- UVa 12063 (DP) Zeros and Ones
题意: 找出长度为n.0和1个数相等.没有前导0且为k的倍数的二进制数的个数. 分析: 这道题要用动态规划来做. 设dp(zeros, ones, mod)为有zeros个0,ones个1,除以k的余 ...
- UVA 10163 Storage Keepers(两次DP)
UVA 10163 Storage Keepers(两次DP) http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Ite ...
- 三维dp&codeforce 369_2_C
三维dp&codeforce 369_2_C 标签: dp codeforce 369_2_C 题意: 一排树,初始的时候有的有颜色,有的没有颜色,现在给没有颜色的树染色,给出n课树,用m种燃 ...
- uva 11584 Partitioning by Palindromes 线性dp
// uva 11584 Partitioning by Palindromes 线性dp // // 题目意思是将一个字符串划分成尽量少的回文串 // // f[i]表示前i个字符能化成最少的回文串 ...
- UVA - 825Walking on the Safe Side(dp)
id=19217">称号: UVA - 825Walking on the Safe Side(dp) 题目大意:给出一个n * m的矩阵.起点是1 * 1,终点是n * m.这个矩阵 ...
- P1006 传纸条(二维、三维dp)
P1006 传纸条 输入输出样例 输入 #1 复制 3 3 0 3 9 2 8 5 5 7 0 输出 #1 复制 34 说明/提示 [限制] 对于 30% 的数据,1≤m,n≤10: 对于 100% ...
- 紫书 习题 10-15 UVa 12063(数位dp)
大佬真的强!!https://blog.csdn.net/u014800748/article/details/45225881 #include<cstdio> #include< ...
随机推荐
- 部署本地gitlab
一.gitlab简介 GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能 ...
- 设计模式——抽象工厂模式
Abstract Factory模式,即抽象工厂模式,该模式要求Factory类为抽象的,并且里面的生产出来的产品也是抽象的! 这里需要着重说的一点就是,抽象类和抽象方法的作用--规范了子类的实现,以 ...
- CDH部署日志
CDH部署时出现如图所示的错误 可去服务器查看:/opt/cm-5.5.0/run/cloudera-scm-agent/process/ccdeploy_hbase-conf_etchbasecon ...
- NoSQL文章
MongoDB Bugsnag的MongoDB分片集群使用经验
- Linux升级python至3.4.4
wget https://www.python.org/ftp/python/3.4.4/Python-3.4.4.tgz ls .tgz mkdir /usr/local/python3 cd Py ...
- C++入门(1)
#include<>直接从编译器自带的函数库中寻找文件 #include""是先从自定义的文件中找 ,如果找不到在从函数库中寻找文件 采用"< > ...
- des/3des
一.python 1. des3 python平台的DES3 + base64 加密解密, 有两个常用的库pycrypto和pyDes 1)pycrypto des3.py #coding=utf-8 ...
- nanomsg(ZeroMQ with C)
1.应用手册 https://github.com/nanomsg/nanomsg % mkdir build % cd build % cmake .. % cmake --build . % ct ...
- UVA10100:Longest Match(最长公共子序列)&&HDU1458Common Subsequence ( LCS)
题目链接:http://blog.csdn.net/u014361775/article/details/42873875 题目解析: 给定两行字符串序列,输出它们之间最大公共子单词的个数 对于给的两 ...
- 创建发布Webservice以及wsimport工具
一. 通过wsimport生成本地代理调用WebService 1.推荐的访问服务方式 WebService已纳入w3c规范,其他的平台都支持该规范 :J2EE\Php\.NET都支持wsimport ...