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< ...
随机推荐
- flume jetty 进程关系 flume jetty 跨域问题 jetty 源码分析
flume jetty 跨域问题 13481 httpSource的端口进程号 = flume 启动后的进程号 [root@c log]# netstat -atp Active Internet ...
- 如何取option自定义属性?
1.SELECT代码: <select name="zcdq" id="zcdq" class="easyui-validatebox" ...
- Django源码安装方法及创建启动项目
一.源码安装方法 下载源码包:https://www.djangoproject.com/download/ 输入以下命令并安装: tar xzvf Django-X.Y.tar.gz # 解压下载包 ...
- JavaScript json和字符串互转
JavaScript内置json和字符串互转的函数JSON,不需要引入外部组件 JSON.stringify(obj)将JSON转为字符串. JSON.parse(string)将字符串转为JSON格 ...
- alexnet,VGG,googlenet,resnet
非常好的一篇:https://my.oschina.net/u/876354/blog/1637819 alexnet和VGG没什么特别的,VGG深一些. Deep learning 实际上是一种 f ...
- tornado调用ioloop TracebackFuture实现非堵塞的模块
转载http://xiaorui.cc/2014/11/26/tornado调用ioloop-tracebackfuture实现非堵塞的模块/ 当然实现的方法,还是存在点问题的, 但是最少流程是跑通了 ...
- VirtualBox network / study environment setup for RHEL
I re-visited the RHEL study material and setup the environment again, noted down the procedure. 1, c ...
- jQuery中this与$(this)的差别
jQuery中this与$(this)的差别 $("#textbox").hover( function() { this.title ...
- Art of Android Develop. Activity的生命周期和启动模式。
1. onCreate() , onRestart(), onStart(), onResume(), onPause(), onStop(), onDestroy() 2.
- 使用paramiko的SFTP get或put整个目录
在<使用paramiko执行远程linux主机命令>中举例说明了执行远程linux主机命令的方法,其实paramiko还支持SFTP传输文件. 由于get或put方法每次只能传输一个文件, ...