hdu2089(数位DP)

来源:互联网 发布:java 解压加密rar文件 编辑:程序博客网 时间:2024/05/22 04:28

这是我自接触DP以来,第三次学DP,这次打算学数位DP,

刚拿到这题时就觉得这题用暴力也能过,然后通过打表就把这题A了,但是我的本意是数位DP,所以我又用数位DP来解这题

题意:求区间a到b中不含有62和4的数。

下面的思路是借鉴人家,代码附在下面,详细解法看注释:

#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#include<time.h>#include<math.h>#define inf 0x7fffffff#define eps 1e-9#define pi acos(-1.0)#define P system("pause")using namespace std;int dp[10][3];//分为3种情况:1、不含有不吉利数字;2、不含有吉利数字且最高位是2;3、含有不吉利数字 //dp[i][j],i表示位数,j表示属于哪种情况 ,dp[i][j]表示各种情况对应的数目int fun(int n){    int a[10];    int len = 1;    int n1 = n;    while(n)    {          a[len++] = n % 10;          n /= 10;              }        a[len] = 0;    int ans = 0;//记录不吉利数字的个数     bool flag = 0;    for(int i = len; i >= 1; i--)//从n的高位开始考虑    {          ans += a[i]*dp[i-1][2];//i-1位中存在不吉利数字          if(flag) ans += a[i]*dp[i-1][0];//如果已经是不吉利数字,那么当前位可以随便加          if(!flag && a[i] > 4) //注意没有等于号,当前位可以为4的情况                ans += dp[i-1][0];          if(!flag && a[i] > 6)   //当前位是6的情况                ans += dp[i-1][1];          if(!flag && a[i] > 2 && a[i+1] == 6)  //当前位是2的情况                ans += dp[i][1];          if(a[i] ==4 || (a[i+1] == 6 && a[i] == 2))            flag = 1;                   }    if(flag) ans++;//考虑n这个数     return n1 - ans;}int main(){//freopen("input.txt","r",stdin);//freopen("output.txt","w",stdout);    memset(dp,0,sizeof(dp));    dp[0][0] = 1;    int i,j;    for(i = 1; i <= 6; i++)    {          dp[i][0] = dp[i-1][0]*9 - dp[i-1][1];          dp[i][1] = dp[i-1][0];          dp[i][2] = dp[i-1][2]*10 + dp[i-1][0] + dp[i-1][1];          }    /* for( i = 0; i <= 6; i++){        for(j = 0; j < 3; j++)           cout<<dp[i][j]<<" ";        cout<<endl;           }*/     int a,b;    while(scanf("%d%d",&a,&b))    {         if(!a && !b) break;         printf("%d\n",fun(b)-fun(a-1));                                                                            }       //  P;                                   return 0;    }


0 0
原创粉丝点击