Codeforces 914 C. Travelling Salesman and Special Numbers (数位DP)
2024-10-19 00:24:54
题目链接:Travelling Salesman and Special Numbers
题意:
给出一个二进制数n,每次操作可以将这个数变为其二进制数位上所有1的和(3->2 ; 7->3),现在给出了一个数k,问不大于n的数中有几个数经过k次操作可以变成1。
题解:
因为所给的n很大,但是可以发现只要经过一次操作,n都会变成1000以内的数,所以可以把1000以内的数的答案都存下来。每次在这里面找等于k-1的数,然后数位DP求个数。
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1e3+;
const int MOD = 1e9+;
char s[MAX_N];
int len;
int f[MAX_N][MAX_N];
long long res[MAX_N];
void init()
{
memset(f,-,sizeof(f));
for(int i=;i<=;i++)
{
int t = i;
int num = ;
while(t>)
{
int temp = ;
while(t)
{
t -= t&-t;
temp++;
}
t = temp;
num++;
}
res[i] = num;
}
}
int dp(char *s,int pos,int num,int tar,int limit)
{
if(num > tar || tar>) return ;
if(pos == len)
{
if(num == tar) return ;
else return ;
}
if(!limit && f[pos][tar-num]!=-) return f[pos][tar-num];
int up = limit?s[pos]-'':;
int ans = ;
for(int i=;i<=up;i++) ans = (ans + dp(s,pos+,i==?num+:num,tar,limit&&i==up))%MOD;
if(!limit) f[pos][tar-num] = ans;
return ans;
}
int main()
{
init();
scanf("%s",s);
len = strlen(s);
int num = ;
int k;
cin>>k;
if(k==)
{
cout<<<<endl;
return ;
}
if(k==)
{
cout<<len-<<endl;
return ;
}
long long ans =;
for(int i=;i<len;i++) if(s[i] == '') num++;
for(int i=;i<=;i++)
{
if(res[i] == k-)
{
ans = (ans + dp(s,,,i,))%MOD;
//cout<<"...."<<i<<"....."<<dp(s,0,0,i,1)<<endl;
}
}
cout<<ans<<endl;
}
最新文章
- SQL语句实现Split并合并查询结果
- js乱码解决方法
- Flex:自定义滚动条样式/隐藏上下箭头
- markdown思维导图笔记
- Rotate String
- hdu 1021
- Codevs No.1287 矩阵乘法
- Android ListView分页加载时图片显示问题
- Centos6.4安装JDK
- newlisp 接受jenkins带空格的参数
- shuffle过程简介--笔记
- Java 生产者消费者模式详细分析
- USB2.0学习笔记连载(一):CY7C68013特性简介
- ajax的type为get的时候报405错误,改成post就OK,这是为什么?老师写的get可以请求成功,我的就不行,附图
- 带你从零学ReactNative开发跨平台App开发(二)
- Debian下的crontab保存
- Android SharedPreference
- JS 写入到文件
- Onvif鉴权实现方式
- 队列之blah集合
热门文章
- Redis(三)Redis基本命令操作与API
- jenkins+gitlib+git+mysql5.6+sonarqube+sonarrunner
- Linux FFmpeg(含x264、lame插件)安装记录
- windows server 2016部署服务
- CI 2.2 + smarty 3.1.18 完美整合配置成功
- php解决约瑟夫环的问题
- Java 替换空格
- gitlab+jenkins环境搭建.md
- using指令都用了这么多年了,其实还真没懂!
- OOP——构造函数、析构函数