hdu5106 数位dp
这题说的是给了一个二进制数R , 计算出 在[0,R) 区间内的数, 二进制中有n个1 个和
n<=1000; R<2^1000, 这样 用dp[len][lee] 表示在第len位的时候已经放了lee个1 个总和, num[len][lee] 表示在第len位的时候已经放了lee个1 个数有多少个,这样只要考虑当前位置放1与不放1 记忆化进行搜索
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>
using namespace std;
const int maxn =;
typedef long long ll;
const ll mod=;
ll dp[maxn][maxn];
ll num[maxn][maxn];
char str[maxn];
ll dig[maxn];
void dfs(int loc, int lee , bool e, ll &value, ll &ge)
{
value = ge = ;
if(e==false&& num[loc][lee]!=- ){
value=dp[loc][lee]; ge =num[loc][lee]; return ;
}
if(loc==&&lee==){
value=, ge=; return ;
}
int we = e? str[loc-]-'':;
ll ans=, nu=;
if(we==){
if(loc->=lee){
dfs(loc-,lee,false,ans,nu);
value=ans, ge=nu;
}
if( lee > ){
dfs(loc-,lee-,e,ans, nu);
value=( value + ans + ( dig[loc-] )*nu%mod )%mod;
ge = ( nu + ge )%mod;
}
}else{
if(loc->=lee){
dfs(loc-,lee,e,ans,nu);
value= ans; ge=nu;
}
}
if(e==false) { dp[loc][lee] = value, num[loc][lee]=ge; }
}
int main()
{
int n;
dig[]=;
for(int i=; i<=; ++i)
dig[i]=(dig[i-]*)%mod;
while(scanf("%d%s",&n,str)==){
int len = strlen(str);
for(int i=; i<len/; ++i){
char c = str[i];
str[i]=str[len--i];
str[len--i]=c;
}
memset(dp,,sizeof(dp));
memset(num,-, sizeof(num));
memset(num[],,sizeof(num[]));
num[][]=;
ll ans=,nu=;
dfs( len , n , true, ans, nu);
ll digt=;nu=;
for(int i=; i<len; ++i){
if(str[i]==''){
digt++; nu= ( nu + dig[i])%mod;
}
}
if(digt==n) ans=(ans-nu+mod)%mod;
printf("%I64d\n",ans);
}
return ;
}
hdu5106 数位dp的更多相关文章
- 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP
[BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...
- bzoj1026数位dp
基础的数位dp 但是ce了一发,(abs难道不是cmath里的吗?改成bits/stdc++.h就过了) #include <bits/stdc++.h> using namespace ...
- uva12063数位dp
辣鸡军训毁我青春!!! 因为在军训,导致很长时间都只能看书yy题目,而不能溜到机房鏼题 于是在猫大的帮助下我发现这道习题是数位dp 然后想起之前讲dp的时候一直在补作业所以没怎么写,然后就试了试 果然 ...
- HDU2089 不要62[数位DP]
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 数位DP GYM 100827 E Hill Number
题目链接 题意:判断小于n的数字中,数位从高到低成上升再下降的趋势的数字的个数 分析:简单的数位DP,保存前一位的数字,注意临界点的处理,都是套路. #include <bits/stdc++. ...
- 数位dp总结
由简单到稍微难点. 从网上搜了10到数位dp的题目,有几道还是很难想到的,前几道基本都是模板题,供入门用. 点开即可看题解. hdu3555 Bomb hdu3652 B-number hdu2089 ...
- 数位DP入门
HDU 2089 不要62 DESC: 问l, r范围内的没有4和相邻62的数有多少个. #include <stdio.h> #include <string.h> #inc ...
- 数位DP之奥义
恩是的没错数位DP的奥义就是一个简练的dfs模板 int dfs(int position, int condition, bool boundary) { ) return (condition ? ...
- 浅谈数位DP
在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...
随机推荐
- 编译OSG的FreeType插件时注意的问题
使用自己编译的freetype.lib,在编译osgdb_freetype插件项目时,报错LINK错误,找不到png的一堆函数 最简单的方式是不要使用PNG编译freetype.记住不要犯贱.
- Android App签名打包 与 SDK开发文档
Android App签名打包签名的意义1.为了保证每个程序开发者的合法权益2.放置部分人通过使用相同的Package Name来混淆替换已经安装的程序,从而出现一些恶意篡改3.保证我们每次发布的版本 ...
- HTML5文件拖拽上传记录
JS文件: var FileName = ""; var FileStr = ""; (function () { function $id(id) { ret ...
- 【微信开发】PC端 微信扫码支付成功之后自动跳转
场景: PC端 微信扫码支付 结果: 支付成功 自动跳转 实现思路: 支付二维码页面,写ajax请求支付状态,请求到结果,无论成功还是失败,都跳转到相应的结果页面 具体实现方法: html部分: ...
- 编译boost程序出现如下错误fatal error LNK1104: cannot open file 'libboost_system-vc100-mt-gd-1_54.lib'的解决方法
对于如下程序: #include <iostream> #include <boost/asio.hpp> #include <boost/date_time/posix ...
- Android Processes and Threads
Processes and Threads When an application component starts and the application does not have any oth ...
- javascript关于链接的一些用法
(1)javascript:openURL() http://www.kpdown.com/search?name=Ben Nadel 此URL后边有一个name参数,只不过参数的值竟然带了空格,这样 ...
- chkconfig --add失败的处理方法
author: headsen chen datet:2018-08-30 11:57:49 1,在/etc/init.d/下面添加两个文件,并授予 +X 的权限,效果如下: 2,添加到开启自启 ...
- ShowDoc 搭建 (未成功....)
官方教程:https://www.showdoc.cc/help?page_id=13732 下载了showdoc,服务器映射本地磁盘的时候,服务器用户名和密码忘了... 远程服务器用户名和密码修改 ...
- 170727、MySQL查询性能优化
MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...