CDOJ邱老师选妹子(数位DP)
2015-06-24 17:44
211 查看
<span style="font-family: Arial, Helvetica, sans-serif;">int dp[10][3];</span>
int bit[10]; int n,m; //dp[i][0],表示不存在不吉利的数字 //dp[i][1],表示不存在不吉利的数字,且最高位为2 //dp[i][2],表示存在不吉利数字 void init() { memset(dp,0,sizeof(dp)); dp[0][0]=1; for(int i=1;i<=6;i++) { dp[i][0]=dp[i-1][0]*9-dp[i-1][1];//在最高位加上除了4之外的9个数字,但是可能在6之前加了6 dp[i][1]=dp[i-1][0];//就是在不含不吉利数字的最高位加2 dp[i][2]=dp[i-1][2]*10+dp[i-1][1]+dp[i-1][0];//在已经有不吉利数字最高位加任意数字,或者在无吉利数字前面加4,或者在2前面加4 } } int cal(int n) { int temp=n; memset(bit,0,sizeof(bit)); int len=0; while(n) { bit[++len]=n%10; n/=10; } bit[len+1]=0; int ans=0; bool flag=0; for(int i=len;i>=1;i--) { ans+=bit[i]*dp[i-1][2]; if(flag)//高位已经出现4或者62,后面的就随意 ans+=bit[i]*dp[i-1][0]; else { if(bit[i]>6)//高位可能出现4的情况 ans+=dp[i-1][1]; if(bit[i]>4)//高位是6,后面一位可能出现2 ans+=dp[i-1][0]; if(bit[i+1]==6&&bit[i]>2)//高位可能出现6,要把后面最高位为2计入 ans+=dp[i][1]; } if(bit[i]==4||(bit[i+1]==6&&bit[i]==2))//高位已出现4或者62 flag=1; } if(flag) ans++; return temp-ans; } int main() { init(); while(cin>>n>>m) { if(n==m&&n==0) break; cout<<(cal(m)-cal(n-1))<<endl; } return 0; }学习数位dp的初步,只能看着别人的代码,还是模模糊糊,前进吧。。
相关文章推荐
- python __file__的绝对路径与import的搜索路径
- 一张金融IC卡的交易流程(一)-----基本数据Tag
- 使用phonegap建立安卓webapp项目及其问题总结
- 利用WebMatrix安装drupal7 基于IID+SqlExpress
- 27. 搭建Git服务器
- Programming Quick Start Guide翻译
- 55.统计字符串中大小写的个数
- 奇特的网格加载效果
- 如何提高代码质量1
- 平行志愿需研究 拉开梯度合理定位
- JCOP Shell常用指令
- GlusterFS节点离线修复方法
- 关于cocos引擎初学时那点事(环境搭建,安卓打包等)
- iOS NSThread 的三种创建线程的方法 非常简单好用
- 【Hadoop】2、Hadoop开山篇之虚拟机下ubuntu配置hadoop
- 18道Shell高级编程企业实战题及参考答案
- 最新《VRay 2.0 for sketchup渲染教程》发布芹
- 26. 配置别名
- 在Android中不要将数据存储在Application类中,
- ubuntu 15.04 32b bitcoin 0.91