hdu4734
来源:互联网 发布:淘宝网店推广要钱吗? 编辑:程序博客网 时间:2024/06/03 21:45
题意:
定义f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+…a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字。
题目给出a,b,求出0~b有多少个不大于f(a)的数。
思路:
常见数位dp定义含义:dp[len][presum]:
长度为len的前缀以presum开头的满足条件的个数。
而这题,行不通,因为每次f(a)都在变化,需要定义为三维的dp[len][presum][f(a)] 就变成10*4600*4600。
我们重新定义dp[len][presum]表示为:
长度为len的前缀和不大于presum满足条件的个数。
#include<bits/stdc++.h>using namespace std;int dp[12][5000],dig[12],A,B;int dfs(int pos,int pre,bool limit){ if(pos<1) return pre>=0; if(pre<0) return 0; if(!limit&&dp[pos][pre]!=-1) return dp[pos][pre]; int ed=limit ? dig[pos]:9; int ans=0; for(int i=0;i<=ed;i++){ ans+=dfs(pos-1,pre-i*(1<<(pos-1)),limit&&i==ed); } if(!limit) dp[pos][pre]=ans; return ans;}int cal(int x){ int ans=0,t=0; while(x){ ans+=(x%10)*(1<<(t++)); x/=10; } return ans;}int sol(int x){ int p=0; while(x){ dig[++p]=x%10; x/=10; } //cout<<"cal="<<cal(A)<<"p="<<p<<endl; return dfs(p,cal(A),true);}int main(){ int T,cnt=1;scanf("%d",&T); memset(dp,-1,sizeof(dp)); while(T--){ int a,b;scanf("%d%d",&A,&B); printf("Case #%d: %d\n",cnt++,sol(B)); }}
0 0
- hdu4734
- hdu4734
- hdu4734之数位dp
- hdu4734(数位DP)
- hdu4734(数位DP)
- hdu4734(记忆化搜索)
- hdu4734(数位DP)
- hdu4734(数位DP)
- hdu4734数位dp
- hdu4734(数位dp)
- hdu4734(数位dp)
- hdu4734(数位dp)
- 数位DP HDU4734
- HDU4734 F(x)
- HDU4734[F(x)]
- HDU4734 F(x)
- hdu4734,F(x), 数位dp
- hdu4734 F(x) 数位dp
- 从《乌合之众》看代码重构
- SQL考试一
- c++内存模型
- 用HTML写一首诗
- Github本地仓库和远程仓库节点对比
- hdu4734
- Thinking in Java 4th
- sql考试二
- day2作业
- java中的基础《1》
- Linux上的free命令详解
- AOJ 848 分数拆分
- Leetcode 13. Roman to Integer The Solution of Python
- 【mvc】——jquery.fom.js的核心方法ajaxsubmit实例