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< ...
随机推荐
- C程序编译过程浅析(转)
前几天看了<程序员的自我修养——链接.装载与库>中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧. 我现在一般都是用gcc,所以自然以GCC编译hellworld ...
- 研究php单例模式实现数据库类
实现单例模式:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例. 单例模式的逻辑:类里面声明一个静态的方法和变量,静态变量用 ...
- 在HTML里面HEAD部分的META元素要表达的内容是什么
1.name属性主要有以下几种参数: A.Keywords(关键字) 说明:keywords用来告诉搜索引擎你网页的关键字是什么. 举例:<meta name ="keywords&q ...
- 【使用时发生的意外】file is not sufficiently replicated yet
异常堆栈如下: -- ::, ERROR [com.ultrapower.secsight.util.HdfsUtil] - 追加写入文件失败! org.apache.hadoop.ipc.Remot ...
- 解决 Invalid signature file digest for Manifest 问题
idea打包的jar文件在spark执行是报错: Invalid signature file digest for Manifest 通过以下命令解决: zip -d myjob.jar META- ...
- git学习------>git-rev-parse命令初识
一.准备工作 第一步:在d盘git test目录下,新建工作区根目录demo,进入该目录后,执行git init创建版本库. DH207891+OuyangPeng@DH207891 MINGW32 ...
- 设计模式中类的关系UML
在java以及其他的面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖.关联.聚合.组合.继承.实现.他们的耦合度依次增强. 1. 依赖(Dependence) 依赖关系的定义为:对于两 ...
- 如何查看windows某个目录下所有文件/文件夹的大小?
如何查看windows某个目录下所有文件/文件夹的大小? TreeSize Free绿色汉化版是一款硬盘空间管理工具,用树形描述出来,能够显示文件大小和实际占用空间数及浪费的空间等信息,让你做出相应的 ...
- CloudFoundry V2 单机版离线安装(伪离线安装)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wangdk789/article/details/30255763 之前安装CloudFou ...
- UVA10100:Longest Match(最长公共子序列)&&HDU1458Common Subsequence ( LCS)
题目链接:http://blog.csdn.net/u014361775/article/details/42873875 题目解析: 给定两行字符串序列,输出它们之间最大公共子单词的个数 对于给的两 ...