HDU3555->数位DP
2016-07-12 20:51
344 查看
//数位DP //从最高位开始向下DP #include<stdio.h> #include<iostream> #include<string.h> using namespace std ; int bit[40] ; long long dp[40][3] ; //dp[len][0] 代表数字长度为len不含49的个数 //dp[len][1] 代表数字长度为len不含49但是以9开头的个数(显然dp[len][1]包含在dp[len][0]中) //dp[len][2] 代表数字长度为len含有49的个数 void Init() { memset(dp , 0 , sizeof(dp)) ; dp[0][0] = 1 ; for(int i = 1 ; i <= 22 ; i ++) { dp[i][0] = dp[i-1][0] * 10 - dp[i-1][1] ; dp[i][1] = dp[i-1][0] ; dp[i][2] = dp[i-1][2] * 10 + dp[i-1][1] ; } } long long solve(long long n) { long long temp = n ; int len = 0 ; while(n != 0) { bit[++ len] = n % 10 ; n /= 10 ; } bit[len + 1] = 0 ; long long sum = 0 ; int flag = 0 ; for(int i = len ; i >= 1 ; i --) { sum += bit[i] * dp[i-1][2] ; if(flag) sum += bit[i] * dp[i-1][0] ;//当前已经有49,则后面的处理任意 if(!flag && bit[i] > 4) sum += dp[i-1][1] ;//当bit[i]=4时,有一种可能出现49 if(bit[i+1] == 4 && bit[i] == 9) flag = 1 ;//说明当前有49 } return sum ; } int main() { int T ; long long num; Init() ; while(scanf("%d", &T) != EOF) { while(T --) { scanf("%I64d" , &num) ; cout << solve(num+1) << endl ; } } return 0 ; }
相关文章推荐
- spoj5971 LCM Sum
- 线程的3种实现方式--内核级线程, 用户级线程和混合型线程
- 二、分布式服务框架Zookeeper学习笔记
- 打造高逼格耀斑效果
- 一个用于获取Image对象以及AudioClip对象的工具类
- linux防止DDoS攻击
- FloatingActionButton的一点学习感悟
- 113. Path Sum II
- HTML DOM概念及相关操作
- 永不落幕的 zy [HN2016师大附中省队集训day2]
- Java 位运算(移位、位与、或、异或、非)
- Android 在布局中用代码随意添加视图
- HDU 4513 单增回文 manacher
- 【华为OJ】字符串加密
- 简单HTML的使用
- 链接地址
- as follows ,as follow && following
- java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.Log4
- Mybatis3.2+版本 log4j2 Debug 模式打印sql语句
- Fibonacci sequence