博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 12063 - Zeros and Ones(数位DP)
阅读量:5243 次
发布时间:2019-06-14

本文共 1149 字,大约阅读时间需要 3 分钟。

题目链接

【题意】

给出n和k(n<=64,k<=100)问你有多少个n位(无前导0)的二进制数的1和0一样多,同时值为k的倍数

【思路】

数位DP,dp[pos][sum][mod]dp[pos][sum][mod] 表示枚举到pos位时数字0和1的相对个数以及当前对应的数字modkmodk 对应的结果,记忆化搜索

#include
using namespace std;typedef long long ll;int n,k;int a[80];ll dp[80][160][120];ll dfs(int pos,int sum,int mod,bool lead,bool limit){ if(pos==-1){ if(sum==80 && mod==0) return 1; else return 0; } if(!lead && !limit && dp[pos][sum][mod]!=-1) return dp[pos][sum][mod]; int up=limit?a[pos]:1; ll ans=0; for(int i=0;i<=up;++i){ if(lead && i==0){ ans+=dfs(pos-1,sum,(mod*2+i)%k,lead,limit && i==up); } else{ ans+=dfs(pos-1,sum+(i==0?1:-1),(mod*2+i)%k,lead && 0==i,limit && i==up); } } if(!lead && !limit) dp[pos][sum][mod]=ans; return ans;}int main(){ //freopen("in.txt","r",stdin); //freopen("out2.txt","w",stdout); int T; scanf("%d",&T); for(int kase=1;kase<=T;++kase){ scanf("%lld%lld",&n,&k); if(0==k){
printf("Case %d: 0\n",kase);continue;} memset(dp,-1,sizeof(dp)); for(int i=0;i

转载于:https://www.cnblogs.com/wafish/p/10465204.html

你可能感兴趣的文章
D - Mike and strings
查看>>
C++:多维数组的动态分配(new)和释放(delete)
查看>>
c#基础学习(0806)之抽象类实现多态
查看>>
S5PV210根文件系统的制作(一)
查看>>
51NOD 1244 莫比乌斯函数之和
查看>>
[bzoj1923]外星千足虫[高斯消元]
查看>>
返利项目 1
查看>>
多重背包(二进制模板+普通解法)
查看>>
广义逆高斯分布(Generalized Inverse Gaussian Distribution)及修正贝塞尔函数
查看>>
spring源码之—Assert.notNull
查看>>
1Web语言:开始了解HTML
查看>>
Angular:自定义表单控件
查看>>
数据库相关知识点(秋招整理)
查看>>
JAVA枚举类型的学习和使用
查看>>
PowerShell函数调用问题
查看>>
感想1-前言(第一版)
查看>>
AXI4
查看>>
常用汉字的unicode编码
查看>>
本地项目上传到GitHub
查看>>
62. Unique Paths (Graph; DP)
查看>>