HDU 3555 Bomb(数位dp)
2014-04-03 22:38
323 查看
题目链接:HDU 3555 Bomb
数位dp。
这个题有三种状态,0表示前一位不是4并且前几位没有49,1表示前一位是4并且前几位没有49,2表示前几位有49。
剩下的全写在注释上了。
数位dp。
这个题有三种状态,0表示前一位不是4并且前几位没有49,1表示前一位是4并且前几位没有49,2表示前几位有49。
剩下的全写在注释上了。
#include <iostream> #include <cstring> using namespace std; const int MAX_N = 20 + 5; long long dp[MAX_N][3]; long long num[MAX_N]; long long n; int T; long long f(int pos, int st, bool limit) { if(pos == -1) return st == 2; if(!limit && dp[pos][st] != -1) return dp[pos][st]; long long ans = 0; int last = limit ? num[pos] : 9; for(int i = 0; i <= last; i++) { int temp = st;//开始没这么写,返回值一直是0。。。 if(st == 1 && i == 9)//前一位是4,这一位是9 temp = 2; else if(st == 1 && i != 4)//前一位是4,这一位不是4 temp = 0; else if(i == 4 && st != 2)//这一位是4并且前边不包括49,即st != 2 temp = 1; ans += f(pos - 1, temp, limit && i == last); } if(!limit) dp[pos][st] = ans; return ans; } long long cal(long long n) { int pos = 0; while(n > 0) { num[pos] = n % 10; n /= 10; pos++; } return f(pos - 1, 0, 1); } int main() { cin >> T; memset(dp, -1, sizeof(dp)); while(T--) { cin >> n; cout << cal(n) << endl; } return 0; }
相关文章推荐
- jQuery代码的编写---1.3.2: 编写简单的jQuery代码
- 一个Java程序员应该掌握的10项技能
- 流媒体
- [LeetCode]Multiply Strings
- SeismicPro地震剖面显示程序
- lisp-Scheme学习笔记
- hdu1063 Exponentiation(大整数)
- unity+高通vuforia开发增强现实(AR)教程(二)
- Dom和sax解析方法的区别
- MFC工程中 定义一个变量让所有源程序都能用的最简单的方法
- Android的一些疑问
- Java中的i++探讨
- flex模块发布后白屏,有可能是bug问题
- 【设计模式】设计模式之适配器模式
- 4种检测是否支持HTML5的方法,你知道几个?
- 最长公共子串 NYOJ 36
- ffmpeg
- tomcat server.xml配置详解
- leetcode之Linked List Cycle
- image project