当前位置:编程学习 > C/C++ >>

数位dp基础题目

[cpp]
/********************
language:c++  
author:pirates
problem:hdu2089 
style:数位dp 
*********************/ 
 
 
#include<iostream>  
#include<stdio.h>  
#include<algorithm>  
using namespace std; 
#define Maxx 1000010  
int dp[10][10]; 
//dp[i][0] 代表不是不吉利的个数  
//dp[i][1] 代表最高位为2的个数且是非不吉利数   
//dp[i][2] 代表不吉利个数的总数,62或4都不能存在   
void Init() 

    dp[0][0]=1; 
    for(int i=1;i<=6;i++) 
    { 
        dp[i][0]=dp[i-1][0]*9-dp[i-1][1];//最高位除了4,选择其它9个数,但在2之前可能存在6,所以要减去第二位2的个数  
        dp[i][1]=dp[i-1][0]; //最高位只有2可以选   
        dp[i][2]=dp[i-1][2]*10+dp[i-1][0]+dp[i-1][1];//  
    } 

int Solve(int n) 

    int i,j,flag=0; 
    int bit[10]; 
    int len=0; 
    int tem=n; 
    while(n) 
    { 
        bit[++len]=n%10; 
        n/=10; 
    } 
    bit[len+1]=0; 
    int ans=0; 
    for(int i=len;i>=0;i--) 
    { 
        ans+=dp[i-1][2]*bit[i]; //存在不吉利的数的总数   
        if(flag)     
            ans+=dp[i-1][0]*bit[i]; 
        else  
        { 
            if(bit[i]>4) 
                ans+=dp[i-1][0];    //高位可能出现4的情况   
            if(bit[i+1]==6&&bit[i]>2) 
                ans+=dp[i][1];  //高位为6,第二为可能为2的情况   
            if(bit[i]>6) 
                ans+=dp[i-1][1]; 
            if(bit[i]==4 || (bit[i+1]==6&&bit[i]==2)) 
                flag=1; 
        }        
    } 
    return tem-ans; 
}  
int main() 

    int n,m,i,j; 
    Init(); 
    while(scanf("%d%d",&n,&m)) 
    { 
        if(!n&&!m) break; 
        printf("%d\n",Solve(m+1)-Solve(n));  
    } 
    return 0; 

/********************
language:c++ 
author:pirates
problem:hdu2089
style:数位dp
*********************/


#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define Maxx 1000010
int dp[10][10];
//dp[i][0] 代表不是不吉利的个数
//dp[i][1] 代表最高位为2的个数且是非不吉利数
//dp[i][2] 代表不吉利个数的总数,62或4都不能存在
void Init()
{
 dp[0][0]=1;
 for(int i=1;i<=6;i++)
 {
  dp[i][0]=dp[i-1][0]*9-dp[i-1][1];//最高位除了4,选择其它9个数,但在2之前可能存在6,所以要减去第二位2的个数
  dp[i][1]=dp[i-1][0]; //最高位只有2可以选
  dp[i][2]=dp[i-1][2]*10+dp[i-1][0]+dp[i-1][1];//
 }
}
int Solve(int n)
{
 int i,j,flag=0;
 int bit[10];
 int len=0;
 int tem=n;
 while(n)
 {
  bit[++len]=n%10;
  n/=10;
 }
 bit[len+1]=0;
 int ans=0;
 for(int i=len;i>=0;i--)
 {
  ans+=dp[i-1][2]*bit[i]; //存在不吉利的数的总数
  if(flag) 
   ans+=dp[i-1][0]*bit[i];
  else
  {
   if(bit[i]>4)
    ans+=dp[i-1][0];  //高位可能出现4的情况
    if(bit[i+1]==6&&bit[i]>2)
     ans+=dp[i][1]; //高位为6,第二为可能为2的情况
    if(bit[i]>6)
     ans+=dp[i-1][1];
    if(bit[i]==4 || (bit[i+1]==6&&bit[i]==2))
    flag=1;
  }  
 }
 return tem-ans;
}
int main()
{
 int n,m,i,j;
 Init();
 while(scanf("%d%d",&n,&m))
 {
  if(!n&&!m) break;
  printf("%d\n",Solve(m+1)-Solve(n)); 
 }
 return 0;
}[cpp]
/********************
language:c++  
author:pirates
problem:hdu3555
style:数位dp 
*********************/ 
 
 
#include<iostream>  
#include<stdio.h>  
#include<string.h>  
#include<algorithm>  
using namespace std; 
 
//dp[i][0] 代表不出现49的个数  
//dp[i][1] 最高位为9的个数  
//dp[i][2] 出现49的 个数   
typedef __int64 ll; 
ll dp[30][3]; 
void Init() 

    ll i; 
    memset(dp,0,sizeof(dp));  
    dp[0][0]=1;  
    for(i=1;i<=30;i++){ 
        dp[i][0]=(ll)dp[i-1][0]*10-dp[i-1][1]; //不出现49的个数     
        dp[i][1]=(ll)dp[i-1][0];    //最高位为9的个数  
        dp[i][2]=(ll)dp[i-1][2]*10+dp[i-1][1]; //出现49的个数   
    }  
}  
ll Solve(ll n) 

    ll i,j,len=0; 
    ll bit[25];  
    while(n) 
    { 
        bit[++len]=n%10; 
        n/=10; 
    } 
    bit[len+1]=0; 
    ll ans=0; 
    ll flag=

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,