HDU 2089
来源:互联网 发布:影响力的重要性知乎 编辑:程序博客网 时间:2024/05/18 17:43
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2089
题解:
数位dp
代码:
#include <cstdio> #include <cstring>#include <iostream>#include <algorithm>using namespace std;#define met(a,b) memset(a,b,sizeof(a))#define inf 0x3f3f3f3fint dp[7][10];int num[10];//预处理,将所有的可能进行处理void init(){ met(dp,0); dp[0][0]=1; for(int i=1;i<=7;i++) {// 从第一位向高位进行枚举 for(int j=0;j<=9;j++) { for(int k=0;k<=9;k++) { if(j!=4&&!(j==6&&k==2)) dp[i][j]+=dp[i-1][k]; } } }}int slove(int n){ init(); met(num,0); int len=0; while(n) { num[++len]=n%10;// 注意:这里的++len和上面的互相呼应,都是从1到n的 n/=10; }//num数组记录的是当前数字的所有的位数 int ans=0; for(int i=len;i>=1;i--)// 从高位开始向低位进行判断 { for(int j=0;j<num[i];j++)// 表示的是不超过当前给出的位数的值 { if(j!=4&&!(num[i+1]==6&&j==2))// 除当前的位数是4或则是当前的位数是2,前面的位数是6的时候的情况不加里面(即6。。。2这种情况之下) ans+=dp[i][j]; } if(num[i]==4||(num[i]==2&&num[i+1]==6))// 出现这种情况直接不考虑,直接去掉一组(因为这个组合的数字里面直接出现了62或4这种不满足条件的情况) break; } return ans;}int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; printf("%d\n",slove(m+1)-slove(n));// 因为数位dp的区间为左闭右开区间 }}
0 0
- hdu 2089 && hdu 3555
- HDU.2089 & HDU.3555
- HDU 2089
- hdu 2089
- hdu 2089
- HDU 2089
- hdu 2089
- hdu 2089
- HDU 2089
- hdu 2089
- hdu 2089
- hdu 2089
- HDU 2089
- hdu 2089
- hdu 2089
- HDU 2089
- HDU 2089
- HDU 2089
- 结构型模式01-代理模式(为其他对象提供一种代理以控制这个对象的访问)
- pip 升级的问题解决办法
- Android中Handler的sendEmptyMessage的理解
- 1040. Longest Symmetric String (25)
- TabLayout + ViewPager 的滑动页面
- HDU 2089
- 如何修改jar包中的class文件
- android 性能优化
- ORA-16661: the standby database needs to be reinstated
- http协议基础知识总结
- 剑指offer--调整数组顺序使奇数位于偶数前面
- learning python in the hard way习题1~5的附加题练习
- mysql悲观锁总结和实践
- windows 2012下iis服务器php无法执行exec、system解决方案