HDU2089 不要62 (数位DP)
2015-08-24 21:18
459 查看
传送门
数位DP的入门题,看了半天才看懂。。。
题解:/article/3719891.html
这里再解释一下,dp[i][j]表示第i位数为j的方案,很好想到dp[i][j] = sum(dp[i-1][k])其中j,k≠4,j≠6且k不同时等于2。在求区间[l,r]的时候,可以用区间[1,r]-[1,l-1]。因此,我们可以把dp先预处理出来,这样大大地节约了时间。
自认为这道题还有一个比较抽象的地方,就是在求比某个数小的所有满足题意的时候。具体看我的代码。
数位DP的入门题,看了半天才看懂。。。
题解:/article/3719891.html
这里再解释一下,dp[i][j]表示第i位数为j的方案,很好想到dp[i][j] = sum(dp[i-1][k])其中j,k≠4,j≠6且k不同时等于2。在求区间[l,r]的时候,可以用区间[1,r]-[1,l-1]。因此,我们可以把dp先预处理出来,这样大大地节约了时间。
自认为这道题还有一个比较抽象的地方,就是在求比某个数小的所有满足题意的时候。具体看我的代码。
#include<cstdio> #include<cstring> using namespace std; int dp[10][10]; int digit[10],len; void init()//预处理 { dp[0][0] = 1; for(int i = 1; i <= 7; i++) { for(int j = 0; j <= 9; j++) { if(j == 4) continue; for(int k = 0; k <= 9; k++) { if(k == 4) continue; if(j == 6&&k == 2) continue; dp[i][j] += dp[i-1][k]; } } } } void Get(int n) { len = 0; memset(digit,0,sizeof digit); while(n) { digit[++len] = n%10; n /= 10; } } int cal(int n) { int res = 0; Get(n);//得到n的位数 for(int i = len; i >= 1; i--) { for(int j = 0; j < digit[i]; j++) { if(j == 4||(j == 2&&digit[i+1] == 6)) continue; res += dp[i][j]; } if(digit[i] == 4||(digit[i] == 2&&digit[i+1] == 6)) break; /* 为什么这里可以break,我们来看一看这个状态下答案的值是如何求出来的 例如某个数num = 54361,得到的答案是f[5][3] + f[5][2] + f[5][1] + f[5][0] + f[4][3] + f[4][2] + f[4][1] + f[4][0] (没有加f[5][4]的原因是数字中不能有4,f[5][4]的值为0,所以没有加) f[5][j]的数已经包含了所有的以3,2,1开头的5位数和所有的4位数, 而以5开头的5位数是由f[4][j]相加得到的,而f[5][5]包含的数已经大于了原来的数,因此f[4][j]的实际含义就是第5位为5,第4位为j的情况 (开始我就是以为f[5][j]已经包括了所有f[4][k]) */ } return res; } int main() { init(); int l,r; while(scanf("%d%d",&l,&r)&&(l+r)) { printf("%d\n",cal(r+1)-cal(l));//注意是r+1,l,因为我们在求DP的时候,是没有包含端点本身的 } }
相关文章推荐
- poj-1260 Pearls
- lesson1-Win的环境变量以及java环境配置详解
- Windows 下Oracle database 9i 64bit 只有 Windows Itanium 64bit
- C++ Vector 简单实现 会用也要会写
- HDU-4777 Rabbit Kingdom
- iOS系统声音列表
- Rosetta Stone的#1141错误
- 【JavaScript基础知识】——运算符
- Ancient Printer
- mac shell 设置dns
- ImageView属性
- Centos6.5里安装Hbase(伪分布式)
- (笔试题)路径走法
- POJ 1000 A+B Problem
- oracle数据库的删除
- 【C++】为多态基类声明virtual析构函数
- 构造器模式
- 解决 RHEL 7/ CentOS 7/Fedora 出现Unit iptables.service failed to load
- Android:利用Style和include标签来减少布局中的重复代码
- [PHP] php基础