博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu3555 数位dp一:不含49的数
阅读量:6091 次
发布时间:2019-06-20

本文共 2176 字,大约阅读时间需要 7 分钟。

首先递推公式:

dp[i][0] = dp[i-1][0] * 10 - dp[i-1][1];  // 不含49

dp[i][1] = dp[i-1][0];  // 不含49以9开头

dp[i][2] = dp[i-1][2] * 10 + dp[i-1][1]; 
// 含49
 
然后从高位往低位递推,ans+=dp[i][2]*num[i],指i位的方案数。如果前面有49,那么ans可以再+=dp[i][0]*num[i]。否则如果该位比4大,那么可以加上dp[i][1];最后如果前一位4该位为9则可以更新有没有49。
代码:
1 #include
2 #include
3 long long dp[25][5]; 4 int num[25]; 5 int main() 6 { 7 long long ans,x; 8 int T,last,flag,cnt,i; 9 memset(dp,0,sizeof(dp));10 dp[0][0]=1;11 for (i=1;i<=20;i++)12 {13 dp[i][2]=dp[i-1][2]*10+dp[i-1][1];14 dp[i][1]=dp[i-1][0];15 dp[i][0]=dp[i-1][0]*10-dp[i-1][1];16 }17 scanf("%d",&T);18 while (T--)19 {20 scanf("%I64d",&x);21 x++;22 cnt=ans=flag=last=0;23 while (x!=0){24 num[++cnt]=x%10;25 x=x/10;26 }27 for (i=cnt;i>=1;i--)28 {29 ans+=dp[i-1][2]*num[i];30 if (flag)31 ans+=dp[i-1][0]*num[i];32 if (!flag&&num[i]>4)33 ans+=dp[i-1][1];34 if (last==4&&num[i]==9)35 flag=1;36 last=num[i];37 }38 printf("%I64d\n",ans);39 }40 }
View Code

 另外不用递推式,直接递归的写法:

1 #include
2 #include
3 long long dp[25][15][2]; 4 int num[25]; 5 long long dfs(int pos,int pre,int flag,int limit) 6 { 7 int tmp,i; 8 long long ans=0; 9 if (pos==0) return flag;10 if (!limit&&dp[pos][pre][flag]!=-1)11 return dp[pos][pre][flag];12 tmp=limit?num[pos]:9;13 for (i=0;i<=tmp;i++)14 ans+=dfs(pos-1,i,flag||(pre==4&&i==9),limit&&(i==tmp));15 if (!limit)16 dp[pos][pre][flag]=ans;17 return ans;18 }19 int main()20 {21 int T,cnt;22 long long x;23 scanf("%d",&T);24 while (T--)25 {26 scanf("%I64d",&x);27 memset(dp,-1,sizeof(dp));28 cnt=0;29 while (x!=0){30 num[++cnt]=x%10;31 x/=10;32 }33 printf("%I64d\n",dfs(cnt,0,0,1));34 }35 }
View Code

 题目链接:

转载于:https://www.cnblogs.com/xiao-xin/articles/4126623.html

你可能感兴趣的文章
CLI+Terraform简化资源管理的模板编写
查看>>
SQL Server · 特性分析 · 2012列存储索引技术
查看>>
一个锁等待现象的诊断案例
查看>>
C# 命令模式
查看>>
有序数组中找中位数
查看>>
JAVA数据库连接的另一种实现及简单的数据插入及显示
查看>>
阿里云Windows 自动扩容分区脚本
查看>>
[数据结构] 栈
查看>>
指针怎么用
查看>>
【IOS-COCOS2D游戏开发之十三】CCSPRITE利用BEZIER(贝塞尔)做抛物线动作并让CCSPRITE同时播放两个ACTION动作!...
查看>>
Android 文件存放路径【转】
查看>>
CPU GPU设计工作原理《转》
查看>>
[MySQL 5.6 ] Performance Schema学习:命名规范、状态变量及其他(2)
查看>>
mybatis性能优化二之多对多查询:用一次请求解决n次请求查询
查看>>
防止JavaScript自动插入分号
查看>>
Android--使用开源vitamio做万能视频播放器
查看>>
VS2008中使用NUnit
查看>>
SQL SERVER 的模糊查询 LIKE
查看>>
【Python】软件管理工具--pip
查看>>
插入排序之表插入排序
查看>>