hdu 6148 Valley Numer (数位dp)

来源:互联网 发布:川农在线网络教育平台 编辑:程序博客网 时间:2024/05/17 02:49

在强调一下记忆化搜索时间复杂度是O(n)

这里面的记忆化搜索时间复杂度是10*N

一共t组测试数据 

10*N*t

#include<bits/stdc++.h>using namespace std;typedef long long  ll;const int mod=1e9+7;char s[105];int bit[105];ll dp[105][12][5];   int len;ll dfs(int pos,int pre,int st,int lim){    if(pos>=len)    {        if(st==4)return 0;        else return 1;    }    if(!lim&&dp[pos][pre][st]!=-1)return dp[pos][pre][st];    int num=lim?bit[pos]:9;    ll ans=0;    for(int i=0;i<=num;i++)    {        if(st==2)        {            if(i<=pre)                ans=(ans+dfs(pos+1,i,st,lim&&i==num))%mod;            else ans=(ans+dfs(pos+1,i,3,lim&&i==num))%mod;        }        if(st==3)        {            if(i>=pre)            {               ans=(ans+dfs(pos+1,i,3,lim&&i==num))%mod;            }        }        if(st==4)        {            if(i==0)ans=(ans+dfs(pos+1,i,4,lim&&i==num))%mod;            else ans=(ans+dfs(pos+1,i,2,lim&&i==num))%mod;        }    }    if(!lim)dp[pos][pre][st]=ans;    return ans;}int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);   int t;   scanf("%d*c",&t);   while(t--)   {     scanf("%s",s);   memset(dp,-1,sizeof(dp));   memset(bit,0,sizeof(bit));   len=strlen(s);  for(int i=0;i<len;i++)    bit[i]=(s[i]-'0');   printf("%I64d\n",dfs(0,0,4,1)%mod);   }    return 0;}