hdu 4734 F(x) 数位DP
2015-08-10 20:58
337 查看
一,题意:
该题定义了一个函数 : F(x)=An * 2n-1 +
An-1 * 2n-2 + ... + A2 *
2 + A1 * 1。
现在他给定两个数,A,B,要求你求出在区间[0,B] 有多少个x ,使得F(x)<=F(A)。
二,解析:
该题主要应用了,数位dp的思想+记录状态dp的思想。
1,数位dp思想主要数是用数组来存储数,通过对数组每一位进行枚举(0,1,2,,,9),
到达便利区间[0,N]内所有数的目的
例如: 比456小的数,可以这么考虑:
这样就可以遍历[0,456]区间所有的数。
2,记录状态思想,记录下程序已走过的路,当在次走相同的路时直接返回。
至于这么判断是否走同一条路是一般是通过函数参数值,如果用同样的参数去调用同一个函数则所走的路必然是相同的。
所以dp[i][j],数组下标i,j一般表示的就是调用函数的参数。
三:代码:
该题定义了一个函数 : F(x)=An * 2n-1 +
An-1 * 2n-2 + ... + A2 *
2 + A1 * 1。
现在他给定两个数,A,B,要求你求出在区间[0,B] 有多少个x ,使得F(x)<=F(A)。
二,解析:
该题主要应用了,数位dp的思想+记录状态dp的思想。
1,数位dp思想主要数是用数组来存储数,通过对数组每一位进行枚举(0,1,2,,,9),
到达便利区间[0,N]内所有数的目的
例如: 比456小的数,可以这么考虑:
这样就可以遍历[0,456]区间所有的数。
2,记录状态思想,记录下程序已走过的路,当在次走相同的路时直接返回。
至于这么判断是否走同一条路是一般是通过函数参数值,如果用同样的参数去调用同一个函数则所走的路必然是相同的。
所以dp[i][j],数组下标i,j一般表示的就是调用函数的参数。
三:代码:
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> using namespace std; int T,N,M; int bit[15]; int Max[15]; int dp[15][200000]; //dp[len][sum]表示长度为len且权值不大于sum的数的个数。 int DFS(int len,int sum,bool Big) {//len所搜索到的长度,sum是F 剩余的部分,big标记前驱是不是最大数 if(sum<0) return 0; if(len<=0) return 1;//两个边界 if(!Big&&dp[len][sum]!=-1) return dp[len][sum];//记录状态 int bian=9; if(Big)//第len位的边界 bian=Max[len]; int key=0; for(int i=0;i<=bian;i++) key+=DFS(len-1,sum-(i*bit[len]),Big&&(i==bian)); if(!Big) dp[len][sum]=key; return key; } int solve(int n,int m) { int key=0; int len=1; while(n) {//计算F key=key+(n%10)*bit[len]; len++; n=n/10; } len=0; while(m) {//分解M Max[++len]=m%10; m=m/10; } return DFS(len,key,true); } int main() { bit[1]=1; for(int i=2;i<=11;i++) bit[i]=bit[i-1]*2; memset(dp,-1,sizeof(dp)); scanf("%d",&T); for(int k=1;k<=T;k++) { scanf("%d%d",&N,&M); printf("Case #%d: %d\n",k,solve(N,M)); } return 0; }
相关文章推荐
- 根据WOS获取某篇SCI论文被引用次数[Web of Science 统计]
- POJ 1265 Area(Pick 定理)
- HDFS客户端的权限错误:Permission denied
- hdu3572Task Schedule 最大流
- 页面定时跳转(倒计时跳转)代码总结
- POJ 开关问题 1830【高斯消元求矩阵的秩】
- 数据库日常维护-CheckList_02有关数据库备份检查
- 常见的攻击方式详解
- (2)PHP运行时的全局参数
- hdu 1003
- python基础教程学习笔记 — 准备Windows下开发环境
- 并发网络编程学习之路(二):多进程与进程池(续)
- 【动态树问题】LCT学习笔记
- android 实现QQ好友分享和QQ空间分享
- C语言-07-预处理、typedef、static和extern
- H5视频播放自动全屏,暂停退出全屏等功能
- DB2分区表删除和添加分区
- (剑指Offer)面试题59:对称的二叉树
- Advanced Fruits (LCS+递归、模板)
- 我的Android进阶之旅------>HTTP Content-type 对照表