hdu2089(數位dp)
阿新 • • 發佈:2018-11-16
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=2089
思路:數位dp經典入門題,今天總算是刷了一道數位dp的題,大概理解了一下
#include <cstdio> #include <cstdlib> #include <cstring> #include <bitset> #include <cmath> #include <cctype> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <queue> #include <map> #include <set> #include <sstream> #include <iomanip> using namespace std; typedef long long ll; typedef unsigned long long ull; const ll inff = 0x3f3f3f3f3f3f3f3f; #define FOR(i,a,b) for(int i(a);i<=(b);++i) #define FOL(i,a,b) for(int i(a);i>=(b);--i) #define REW(a,b) memset(a,b,sizeof(a)) #define inf int(0x3f3f3f3f) #define si(a) scanf("%d",&a) #define sl(a) scanf("%lld",&a) #define sd(a) scanf("%lf",&a) #define ss(a) scanf("%s",a) #define mod ll(6666666) #define pb push_back #define eps 1e-6 #define lc d<<1 #define rc d<<1|1 #define Pll pair<ll,ll> #define P pair<int,int> #define pi acos(-1) int dp[10][10],a[10],n,m; void get() { dp[0][0]=1; FOR(i,1,9) { FOR(j,0,9) { if(j==4) dp[i][j]=0; else { FOR(k,0,9) dp[i][j]+=dp[i-1][k]; if(j==6) dp[i][j]-=dp[i-1][2]; } } } } int query(int n) { a[0]=0; while(n) a[++a[0]]=n%10,n/=10; a[a[0]+1]=0; ll ans=0; FOL(i,a[0],1) { FOR(j,0,a[i]-1) if(j!=4&&!(a[i+1]==6&&j==2)) ans+=dp[i][j]; if(a[i]==4) break; if(a[i+1]==6&&a[i]==2) break; } return ans; } int main() { cin.tie(0); cout.tie(0); get(); while(scanf("%d%d",&n,&m)==2&&(n+m)) { int x=query(m+1); int y=query(n); printf("%d\n",x-y); } return 0; }
#include <cstdio> #include <cstdlib> #include <cstring> #include <bitset> #include <cmath> #include <cctype> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <queue> #include <map> #include <set> #include <sstream> #include <iomanip> using namespace std; typedef long long ll; typedef unsigned long long ull; const ll inff = 0x3f3f3f3f3f3f3f3f; #define FOR(i,a,b) for(int i(a);i<=(b);++i) #define FOL(i,a,b) for(int i(a);i>=(b);--i) #define REW(a,b) memset(a,b,sizeof(a)) #define inf int(0x3f3f3f3f) #define si(a) scanf("%d",&a) #define sl(a) scanf("%I64d",&a) #define sd(a) scanf("%lf",&a) #define ss(a) scanf("%s",a) #define mod ll(998244353) #define pb push_back #define eps 1e-6 #define lc d<<1 #define rc d<<1|1 #define Pll pair<ll,ll> #define P pair<int,int> #define pi acos(-1) int dp[20][10],a[20],n,m,k; int dfs(int pos,bool state,bool limit) { if(!pos) return 1; if(!limit&&dp[pos][state]!=-1) return dp[pos][state]; int up=limit?a[pos]:9; int res=0; FOR(i,0,up) { if(i==4||state&&i==2) continue; res+=dfs(pos-1,i==6,limit&&i==a[pos]); } if(!limit) dp[pos][state]=res; return res; } int query(int n) { a[0]=0; while(n) a[++a[0]]=n%10,n/=10; return dfs(a[0],0,1); } int main() { cin.tie(0); cout.tie(0); REW(dp,-1); while(scanf("%d%d",&n,&m)==2&&(n+m)) { int x=query(m); int y=query(n-1); printf("%d\n",x-y); } return 0; }
hdu3555
差不多一樣的題
#include <cstdio> #include <cstdlib> #include <cstring> #include <bitset> #include <cmath> #include <cctype> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <queue> #include <map> #include <set> #include <sstream> #include <iomanip> using namespace std; typedef long long ll; typedef unsigned long long ull; const ll inff = 0x3f3f3f3f3f3f3f3f; #define FOR(i,a,b) for(int i(a);i<=(b);++i) #define FOL(i,a,b) for(int i(a);i>=(b);--i) #define REW(a,b) memset(a,b,sizeof(a)) #define inf int(0x3f3f3f3f) #define si(a) scanf("%d",&a) #define sl(a) scanf("%lld",&a) #define sd(a) scanf("%lf",&a) #define ss(a) scanf("%s",a) #define mod ll(1e9+7) #define pb push_back #define eps 1e-6 #define lc d<<1 #define rc d<<1|1 #define Pll pair<ll,ll> #define P pair<int,int> #define pi acos(-1) ll dp[28][10],a[28],n,m; ll dfs(int pos,int qw,bool limit) { if(!pos) return 1; if(!limit&&dp[pos][qw]!=-1) return dp[pos][qw]; int up=limit?a[pos]:9; ll res=0,zz; FOR(i,0,up) { if(qw==4&&i==9) continue; res+=dfs(pos-1,i,limit&&i==a[pos]); } if(!limit) dp[pos][qw]=res; return res; } ll query(ll n) { a[0]=0; while(n) a[++a[0]]=n%10,n/=10; return dfs(a[0],0,1); } int main() { cin.tie(0); cout.tie(0); REW(dp,-1); int t; cin>>t; while(t--) { sl(n); ll x=query(n); printf("%lld\n",n-x+1); } return 0; }