第八周周四总结

  首先看了数位dp,刚看到这个名字,我没理解是什么意思,看了看资料,原来是与数字的位数与是否存在等有关,一般是求一个区间内符合某种关系的数字的个数,而通常与某些特定的数有关,比如资料中的第一题,不要62

这个题就是与数字位数上的数字有关,含有62和4的就是不吉利数字。

刚看到这个题我的思路就是分解每位数字到数组中,然后循环查找。然后呢,这样肯定会浪费许多的时间。

而数位dp是先将一个数的每位上的数分解到数组中,然后在通过深度优先搜索共同求符合条件的数,然后一步步往后推,相当于求出了从0到该数的符合条件的数的个数,而要求从a-b,就是分别求,然后两者所得的值相减,就是符合的区间的答案。

本想去hdu去提交,结果hdu居然也挂了,然后想到vj,vj居然能用,刷新了十几遍才进去vj,现在是不是只有vj能用了。。。。。

#include<iostream>
#include<string.h>
#include<stdio.h>
int dp[8][2],a[8];
int dfs(int len,bool state,bool fp)
{
int i;
if(!len)
    return 1;
if(!fp&&dp[len][state]!=-1)
    return dp[len][state];
int ret=0,fpmax=fp?a[len]:9;
for(i=0;i<=fpmax;i++)
    {
    if(i==4||state&&i==2)
        continue;
    ret+=dfs(len-1,i==6,fp&&i==fpmax);
    }
if(!fp)
    dp[len][state]=ret;
return ret;
}
int f(int n)
{
int len=0;
while(n)
    {
    a[++len]=n%10;
    n/=10;
    }
return dfs(len,false,true);
}
int main()
{
int n,m;
memset(dp,-1,sizeof(dp));
while(~scanf("%d%d",&n,&m),n||m)
    printf("%d\n",f(m)-f(n-1));
return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值