noip 2010 数字统计
2024-09-08 00:18:11
数位dp解水题
dp[i][j]表示 有i位,且首位是j(包括0) 的 ‘2’的个数
dp[i][j]={
Σ(dp[i-1][k]),j!=2;
Σ(dp[i-1][k])+val[i],j!=2;
}
其中val[i]为,十进制下,第i位的权值,
在这里可以当作 如果 j是2 那会多计数几次来使用 令 work(x) 表示 0~x-1 中 '2' 的个数
目标 work(r+1)-work(l);
work()注意
在累加dp[i][j]的同时,统计之前出现了几次‘2’,记为t;
每次再加上t*val[i];
#include<bits/stdc++.h>
using namespace std;
int len,dp[][],digit[],l,r;
int val[]={,,,,,,,};
//dp[i][j]表示 有i位,且首位是j 的 ‘2’的个数
void init(){
dp[][]=;
for(int i=;val[i]<=r;i++)
for(int j=;j<=;j++){
for(int k=;k<=;k++)
dp[i][j]+=dp[i-][k];
if(j==)dp[i][j]+=val[i];
}
}
int work(int x){
len=;
for(;x;x/=)digit[++len]=x%;
digit[len+]=;
int ret=,t=;
for(int i=len;i;i--){
if(digit[i+]==)t++;
for(int j=;j<digit[i];j++)
ret+=dp[i][j]+t*val[i];
}
return ret;
}
int main(){
cin>>l>>r;
init();
cout<<work(r+)-work(l);
return ;
}
最新文章
- OC中协议, 类目, 时间, 延展, 属性
- 基于“事件”驱动的领域驱动设计(DDD)框架分析
- Retention、Documented、Inherited三种注解
- linux编译安装MySQL
- Frenetic Python实验(二)
- csdn第三名
- Mac上因磁盘格式导致gulp无限刷新问题
- <;button>;会自动提交表单吗?
- Java中的匿名类
- Linux下编译安装redis,详细教程
- HW--漂亮度2(测试通过)
- C#多线程解决界面卡死问题
- Hive 的简单使用及调优参考文档
- 转:Maven项目编译后classes文件中没有dao的xml文件以及没有resources中的配置文件的问题解决
- 分布式版本控制系统 Git 教程
- 解决php的sha1和java的sha1(DigestUtils.sha1Hex)产生的字符串不相等的问题
- IDEA jsp模板
- MinerQueue.java 访问队列
- C# 定时任务
- SVM:根据大量图片来精确实现人脸识别—Jason niu