[SCOI2009]windy数 代码 (对应数位dp入门)
Code1 (DP版)
#include<bits/stdc++.h>
#define in(i) (i=read())
using namespace std;
int read()
{
int ans=0,f=1;
char i=getchar();
while(i<'0' || i>'9') {
if(i=='-') f=-1;
i=getchar();
}
while(i>='0' && i<='9') {
ans=(ans<<1)+(ans<<3)+i-'0';
i=getchar();
}return ans*f;
}
int dp[12][10],bit[10];
void init()
{
for(int i=0;i<=9;i++) dp[1][i]=1;
for(int i=2;i<=10;i++) {
for(int j=0;j<10;j++)
for(int k=0;k<10;k++)
if(abs(j-k)>=2) dp[i][j]+=dp[i-1][k];
}
}
int solve(int x)
{
if(x==0) return 0; int ans=0,len=0;
memset(bit,0,sizeof(bit));
while(x) {
bit[++len]=x%10;
x/=10;
}
for(int i=1;i<=len-1;i++)
for(int j=1;j<=9;j++)
ans+=dp[i][j];
for(int i=1;i<bit[len];i++) ans+=dp[len][i];
for(int i=len-1;i>=1;i--) {
for(int j=0;j<bit[i];j++)
if(abs(bit[i+1]-j)>=2) ans+=dp[i][j];
if(abs(bit[i+1]-bit[i])<2) break;
if(i==1) ans++;
}return ans;
}
int main()
{
init(); int a,b;
in(a);in(b);
cout<<solve(b)-solve(a-1)<<endl;
}
Code2(记忆化搜索版)
#include<bits/stdc++.h>
#define in(i) (i=read())
using namespace std;
int read()
{
int ans=0,f=1;
char i=getchar();
while(i<'0' || i>'9') {
if(i=='-') f=-1;
i=getchar();
}
while(i>='0' && i<='9') {
ans=(ans<<1)+(ans<<3)+i-'0';
i=getchar();
}return ans*f;
}
int bit[11], dp[11][10];
int dfs(int len,int pre,int f,int limit)
{
int ans=0;
if(!len) return 1;
if(!limit && f && dp[len][pre]) return dp[len][pre];
int maxn=limit?bit[len]:9;
for(int i=0;i<=maxn;i++)
{
if(abs(i-pre)>=2) {
int p=i;
if(pre==-10 && !i) p=pre;
ans+=dfs(len-1,p,f||i!=0,limit && i==maxn);
}
}
if(!limit && f) dp[len][pre]=ans;
return ans;
}
int solve(int a)
{
memset(bit,0,sizeof(bit));
int k=0;
while(a) {
bit[++k]=a%10;
a/=10;
}return dfs(k,-10,0,1);
}
int main()
{
int a,b;
in(a);in(b);
cout<<solve(b)-solve(a-1)<<endl;
return 0;
}
[SCOI2009]windy数 代码 (对应数位dp入门)的更多相关文章
- [BZOJ1026][SCOI2009]windy数 解题报告|数位dp
Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 一直 ...
- 数位dp入门(内容一样,新版格式)
顾名思义,数位dp,是一种用来计数的dp,就是把一个数字拆成一个一个数位去统计 如果现在给你一道题,需要你求在区间[l,r]内满足条件的解的个数,我们很容易想到去暴力枚举,但要是数据范围太大这种办法就 ...
- bzoj 1026 [SCOI2009]windy数 数位dp
1026: [SCOI2009]windy数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...
- bzoj 1026 [SCOI2009]windy数(数位DP)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4550 Solved: 2039[Submit][Sta ...
- BZOJ_1026_[SCOI2009]windy数_数位DP
BZOJ_1026_[SCOI2009]windy数_数位DP 题意:windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之 ...
- bzoj1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8203 Solved: 3687[Submit][Sta ...
- luogu P2657 [SCOI2009]windy数 数位dp 记忆化搜索
题目链接 luogu P2657 [SCOI2009]windy数 题解 我有了一种所有数位dp都能用记忆话搜索水的错觉 代码 #include<cstdio> #include<a ...
- 2018.06.30 BZOJ1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻两 ...
- [bzoj1026][SCOI2009]windy数——数位dp
题目 求[a,b]中的windy数个数. windy数指的是任意相邻两个数位上的数至少相差2的数,比如135是,134不是. 题解 感觉这个题比刚才做的那个简单多了...这个才真的应该是数位dp入门题 ...
随机推荐
- 搞懂Dubbo SPI可拓展机制
前言 阅读本文需要具备java spi的基础,本文不讲java spi,please google it. 一.Dubbo SPI 简介 SPI(Service Provider Interface) ...
- Hinton等人新研究:如何更好地测量神经网络表示相似性
Hinton等人新研究:如何更好地测量神经网络表示相似性 2019年05月22日 08:39:15 喜欢打酱油的老鸟 阅读数 177更多 分类专栏: 人工智能 https://www.toutia ...
- List与Set区别
List: 元素有序放入,元素可重复 Set: 元素无序保存,元素不可重复(通过==判断,非基本类型判断的是引用地址),因为set是无序的,故只能通过迭代器循环.ps:说是无序,但是其实set中的元素 ...
- 阿里云语音合成(汉语英语)带UI界面的小程序(python)
一,项目说明 将汉文转汉语.英文转英语,同时又有逗号<###English###>,<,,,>和句号<...>标志符用于文件处理.其中英文包含在### 英文 ### ...
- JS基础_算数运算符
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- vue 数据驱动原理,响应式 原理?
Object.defineProperty(obj,"name",{ get(){ console.log("被访问了") return obox.innerH ...
- linux递归查找目录下所有文件夹以及文件
相对于ls或者ll,可能find在这个时候更加给力 先看我的目录结构 tree命令是查看目录的结构,而且最后会列出所有的directory的数目以及文件夹的数目...好像我们接下来要做的就没有必要了, ...
- eval的使用
当逻辑字符串是拼接而成的时候可以用eval来判断真假 eg:let a= "22" let b = ">" let c = "1" 用 ...
- git统计某个时间段写的代码行数
1. 任务需要 领导想每个迭代统计一下,当前迭代开发的代码数量是多少 2. 解决方法 git log --stat --since=2019-09-12 --until=2019-09-27 | pe ...
- SQL语句复习【专题四】
SQL语句复习[专题四] 多表查询 sql 92多表查询 sql92.sql99 标准--查询所有员工的姓名,部门编号,部门名称select * from empselect * from dept- ...