博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj3252(数位dp)
阅读量:6897 次
发布时间:2019-06-27

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

题目链接:https://vjudge.net/problem/POJ-3252

题意:求[l,r]之间的Round Number数,RN数即化为二进制后0的个数不少于1的个数的数。

思路:之前用组合数求写过,最近学数位dp,又用数位dp来写一次。用dp[pos][n0][n1]表示长为pos+1的数(我从0开始定义的),之前已经有n0个0和n1个1的前提下RN数有多少,用lead表示是否前导0,最后的递归终止条件为if(pos==-1) return n0>=n1。

AC代码:

#include
#include
using namespace std;int a[35],dp[35][35][35];int dfs(int pos,int n0,int n1,bool lead,bool limit){ if(pos==-1) return n0>=n1; if(!limit&&!lead&&dp[pos][n0][n1]!=-1) return dp[pos][n0][n1]; int up=limit?a[pos]:1,tmp=0; for(int i=0;i<=up;++i){ if(lead){ if(!i) tmp+=dfs(pos-1,n0,n1,lead&&!i,limit&&i==a[pos]); else tmp+=dfs(pos-1,n0,n1+1,lead&&!i,limit&&i==a[pos]); } else{ if(!i) tmp+=dfs(pos-1,n0+1,n1,lead&&!i,limit&&i==a[pos]); else tmp+=dfs(pos-1,n0,n1+1,lead&&!i,limit&&i==a[pos]); } } if(!limit&&!lead) dp[pos][n0][n1]=tmp; return tmp;}int solve(int x){ int pos=0; while(x){ a[pos++]=x%2; x/=2; } return dfs(pos-1,0,0,true,true);}int main(){ memset(dp,-1,sizeof(dp)); int l,r; scanf("%d%d",&l,&r); printf("%d",solve(r)-solve(l-1)); return 0;}

 

转载于:https://www.cnblogs.com/FrankChen831X/p/10763022.html

你可能感兴趣的文章
JSON 转javabean 利器
查看>>
基于W5500+Yeelink的远程灯光控制设计
查看>>
Notes中几个处理多值域的通用函数
查看>>
量化生产力Quantifying Productivity
查看>>
趣文:我是一个线程
查看>>
iOS - UIAlertView
查看>>
【资料下载区】【iCore3相关代码、资料下载地址】更新日期2017/06/28
查看>>
短信发送的流程,硬编码在了服务方法里面,优化方案
查看>>
tcpdump
查看>>
maven的pom文件中配置测试用例
查看>>
Swift 方法
查看>>
angularjs等号运算
查看>>
LeetCode: Symmetric Tree 解题报告
查看>>
C# 线程手册 第五章 扩展多线程应用程序 CLR 和 线程
查看>>
html a name href
查看>>
JavaScript中json对象和string对象之间相互转化
查看>>
arm程序的反汇编程序
查看>>
SQL Server 2008数据库的一些基本概念
查看>>
在ASP.NET中重写URL
查看>>
职业化
查看>>