Lonlife 1016 Change of Life
定义f(x)f(x)为LIS(a0,a1...am)(n=a0+a1×10+...+am×10m,0≤ai≤9,am≠0)LIS(a_0,a_1...a_m)(n = a_0 + a_1\times 10+...+a_m\times 10^m,0\le a_i\le 9,a_m\neq 0)
求∑ni=1f(i)\sum_{i=1}^nf(i)
1≤n≤10151 \le n \le 10^{15}
一眼看过去就是一个数位dpdp,但是我们用怎么样的状态表示最长上升子序列这个东西呢?
考虑到最长上升子序列的二分nlog(n)nlog(n)解法中用到的状态表示dpidp_i表示长ii的最长上升子序列结尾最小的那个序列的结尾,同时保证了dpdp数组的单调性。
因为是严格上升,所以dpdp数组是不重复的。因为序列中的数只有[0,9][0,9]这10个数,我们可以用状态压缩保存dpdp数组有哪几个数,又因为dpdp数组的单调性,所以这个状态表示是唯一的。
因为低位在第一个位置的最长上升子序列不好写,改成了最高位在第一个位置的最长下降子序列
#include<bits/stdc++.h>
using namespace std;#define LL long long
const int maxn = 20;LL dp[maxn][1<<10];
int num[maxn];
int nex[1<<10][10],one[1<<10];int tem[maxn];int getnex(int S,int x){int n = 0;for(int i=9;i>=0;i--) if((S>>i) & 1) tem[n++] = i;one[S] = n;for(int i=0;i<n;i++){if(tem[i] <= x){return (S & (~(1<<tem[i]))) | (1<<x);}}return S | (1<<x);
}void init(){for(int i=0;i<(1<<10);i++){for(int j=0;j<10;j++){nex[i][j] = getnex(i,j);}}
}LL dfs(int pos,bool bnd,int sta){if(pos < 0) return one[sta];LL & ndp = dp[pos][sta];if(!bnd && ~ndp) return ndp;LL ret = 0;int bound = bnd ? num[pos] : 9;for(int i=0;i<=bound;i++){ret += dfs(pos-1,bnd && i == bound,nex[sta][i]);}if(!bnd) ndp = ret;return ret;
}LL cal(LL x){int len = 0;while(x){num[len++] = x % 10;x /= 10;}return dfs(len-1,true,0);
}int main(){int T;init();scanf("%d",&T);LL n;memset(dp,-1,sizeof(dp));while(T-- && ~scanf("%lld",&n)){printf("%lld\n",cal(n)-1);;}return 0;
}
Lonlife 1016 Change of Life相关推荐
- mysql中change用法,mysql 中alter的用法以及一些步骤
mysql 中alter的用法以及一些方法 在用到alter的时间,查到了这个文章,就copy下来了,详细进入下面链接: MySQL之alter语句用法总结 1:删除列 ALTER TABLE [表名 ...
- Linux下stat + 文件名后, Access,Modify,Change的含义
我们首先在一个目录下创建了一个文件使用命令touch file 然后输入命令:stat file,这个时候会输出一系列信息 大家注意红色框中的三个时间 Access : 文件最近一次被访问的时间 Mo ...
- java changelistener_ListChangeListener.Change
表示对Observablelist进行的更改的报告. 更改可能包含一个或多个实际更改,并且必须由next()方法迭代. 每个更改必须是以下之一: 在这种情况下, 排列变化 : wasPermutate ...
- jQuery绑定事件的三种常见方式(bind、one、【change、click、keydown、hover】)
一.bind(type,[data],fn):为每个匹配元素的特定事件绑定对应的事件处理函数. 也可以同时给一个元素绑定多个事件,我们来看一下例子: <!DOCTYPE html> < ...
- Oracle CDC (Change Data Capture)更新数据捕获——概述
Change Data Capture能高效识别并捕获数据的插入.修改和删除,使更新数据供个人或应用使用. CDC从oracle 9i开始引入,//TODO 在11G R2之后的版本里将取消支持,被O ...
- 1016. Phone Bills (25)
时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue 去掉非法数据计算账单 A long-distance telep ...
- ORACLE HANDBOOK系列之十四:变化通知(Change Notification)
在App开发的过程中,有些数据访问频率很高但是数据变化不大,我们一般会让它驻留内存以提高访问性能,但是此种机制存在一个问题,那就是如何监测数据的变化,Oracle 10g中引入的 Change Not ...
- 差异基因分析:fold change(差异倍数), P-value(差异的显著性)
做基因表达分析时必然会要做差异分析(DE) DE的方法主要有两种: Fold change t-test fold change的意思是样本质检表达量的差异倍数,log2 fold change的意思 ...
- Error in setwd(***) : cannot change working directory
Error in setwd(***) : cannot change working directory 目录 Error in setwd(***) : cannot change wor ...
- seaborn可视化散点图并自定义数据轴标签(X轴和Y轴的轴标签,Change X Y Axis Labels to a Seaborn Plot)
seaborn可视化散点图并自定义数据轴标签(X轴和Y轴的轴标签,Change X & Y Axis Labels to a Seaborn Plot) 目录
最新文章
- AI一分钟 | 阿里联合蚂蚁金服95亿美元收购饿了么;西湖大学正式获批成立
- yolo如何降低loss_从未看过如此通俗易懂的YOLO系列
- 02.Python网络爬虫第二弹《http和https协议》
- android comparator,Comparator和Comparable实现排序的例子源码及其对比
- 纯虚函数--抽象类中的this到底指的是哪个子类实例呢
- java 怎么用 string method return数量_java教程之Map应该怎么用
- 搭建自己的Unity Package
- 协程分析之 context 上下文切换
- 计算机统计分析spss试卷,《SPSS计算机统计分析方法》试卷A卷
- Win7系统电脑怎么设置桌面壁纸全屏显示
- tssd加载lisp_几个有用的CAD的加载程序LISP
- handsontable使用及遇到的坑-前言
- 安装 Windows 8 跳过密钥的方法
- 世硕电子发放员工证件随手扔地上,其实是一种服从性测试
- 6.计算机系统能力创新实践,计算机考核要重实践能力、培养创新精神
- android 开源 高斯模糊_Android高斯模糊你所不知道的坑
- 信息收集(二)IP信息收集
- PostGIS 入门
- TD源链:让区块链臻于完美
- 上海理工大学计算机考研资料汇总