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 ...
- 解决从Windows拷贝来的文件到Ubuntu出现乱码的问题
1.转换文件内容编码 Windows下天生的纯文本文件,其中文编码为GBK,在Ubuntu下显示为乱码,可以使用iconv命令进行转换: iconv -f gbk -t utf8 sour ...
- Using virtual lists
Download demo project - 15.7 Kb Contents Introduction Virtual list Creating a virtual list Add items ...
- 创建JOB定时执行存储过程
创建JOB定时执行存储过程有两种方式 方式1:通过plsql手动配置job,如下图: 方式2:通过sql语句,如下sql declare job_OpAutoDta pls_integer;--声明一 ...
- 15.遇到window leaked的解决方法
遇到这个可能是android:configChanges没有配置好 可以试试配置为这个 mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navig ...
- python学习笔记(二十五)重写父类方法
python继承中,如果子类在调用某个方法时,它首先是从派生类(也就是当前类)中去找对应的方法,如果当前类中找不到对应的方法,就会去基类(派生类)中去逐个查找. 若父类的方法不能满足子类的需要,那么子 ...
- angular-file-upload
<div id="page-title"> <h2 class="title-hero" ng-if="!isEdit"& ...
- C# DataTable Column DataType 对应 数据库
public DataTable MakeDataTable(){ DataTable myTable; DataRow myNewRow; // Create a new DataTable. ...
- Extjs添加行双击事件
var grid = new Ext.grid.GridPanel({ store: store, trackMouseOver: false, disableSelection: true, aut ...
- 数据库(11)-- Hash索引和BTree索引 的区别
索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...