数位dp的简单使用

来源:互联网 发布:sql limit 编辑:程序博客网 时间:2024/05/06 02:04
题目:给出不多1000位的数,每一位由0、1、2、3组成。
条件:所有的0都在1之前,所有的2都在3之前,0不能在首位,另外0、1、2、3必须出现至少一次。由于数较大所以结果对1000000007取余。
问题:求满足条件的数的数量。

分析:明显这类题目是无法通过暴力遍历解决的。所以需要通过数位dp解决。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int dp[1005][2][2][2][2],digit[1005];void init(){    memset(dp,-1,sizeof(dp));   //初始化dp数组}int dfs(int len,int i,int j,int k,int l,int flag)   //len表示当前位,i,j,k,l分别表示是否包含0、1、2、3(0表示不包含,1表示包含),flag表示是否达到上限(1为达到,0为未达到){    if(len<=0)        return (i&&j&&k&&l);    if(!flag&&dp[len][i][j][k][l]!=-1)        return dp[len][i][j][k][l];    int n=flag?digit[len]:3;    int ans=0;    for(int i1=0;i1<=n;i1++)    {        int i2=i,j1=j,k1=k,l1=l;        if(j==0&&k==0&&l==0&&i1==0)            continue;        if(i1==0&&j==1)            continue;        else if(i1==0&&j==0)            i2=1;        else if(i1==1&&i==0)            continue;        else if(i==1&&i1==1)            j1=1;        else if(i1==2&&l==1)            continue;        else if(i1==2&&l==0)            k1=1;        else if(i1==3&&k==0)            continue;        else if(i1==3&&k==1)            l1=1;        ans=(ans+dfs(len-1,i2,j1,k1,l1,flag&&i1==n))%1000000007;    }    if(!flag)        dp[len][i][j][k][l]=ans;    return ans;}int main(){    int n,summ;    scanf("%d",&n);    init();    digit[n]=2;    for(int i=n-1;i>0;i--)        digit[i]=3;    summ=dfs(n,0,0,0,0,1);    printf("%d\n",summ);    return 0;}
另外,数位dp上面这种实现方式必须dfs函数的for循环对于i,j,k,l形参的操作必须重新定义变量,而不能直接使用原变量,因为这可能导致for循环的下一个循环的变量i,j,k,l改变。

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吃鸡语音用不了怎么办 要杀我的人见面怎么办 转晕了想吐怎么办 原地转圈头晕恶心想吐怎么办 孩子吃凉的呕吐头还晕怎么办 孩子转晕了想吐怎么办 转圈晕了想吐怎么办 我爸总是骂我妈怎么办 转圈转的想吐怎么办 大便干燥拉不出来怎么办 吹完头发很干燥怎么办 腿摔伤了结痂疼怎么办 蹭wifi被禁止后怎么办 电脑wifi给拉黑怎么办 电脑想用无线网怎么办 中路被对方打崩了怎么办 英雄联盟队友太坑怎么办 匹配被王者虐了怎么办 lol碰到嘴臭的怎么办 小婴儿脾气大怎么办呢? 玩游戏输入法会跳出出来怎么办 逆水寒fps太低怎么办 我dcj没地速怎么办 电焊看久眼睛疼怎么办 装修忘了窗帘盒怎么办? 纹眉导致眼肿了怎么办 哭泣引起的眼肿怎么办 在酒店忘记拉窗帘了怎么办 湿气重喉咙有痰怎么办 眼睛上火了肿了怎么办 陌陌直播没人看怎么办 陌陌直播没人气怎么办 我真的爱上你了怎么办 弯腰时间久了腰疼怎么办 斗鱼pk输的怎么办 领导当着人骂我怎么办 被老板骂了应该怎么办 三星s7关机键掉了怎么办 主播遇到黑粉怎么办 在工作单位突然死亡怎么办 孕7月半夜脚抽筋怎么办