码迷,mamicode.com
首页 > 其他好文 > 详细

1049 Counting Ones (30 分)

时间:2021-02-22 12:19:35      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:ems   状态   搜索   use   turn   nes   line   ++   模板题   

数位DP模板题。

状态表示:
\(f[len][cnt]\):表示当前为len位,且当前已统计的\(1\)的个数为cnt个。

注意点:
一开始把\(f\)数组表示成一维了,实际上搜索时每层的状态是个三维向量\((len,cnt,limit)\),limit可以不记录在数组中,但len和cnt是一定要记录在数组当中的。

int f[15][15];
int a[15];
int n;

int dfs(int len,int cnt,bool limit)
{
    if(len == 0) return cnt;
    if(!limit && ~f[len][cnt]) return f[len][cnt];

    int num=limit?a[len-1]:9;
    int res=0;
    for(int i=0;i<=num;i++)
    {
        res+=dfs(len-1,cnt+(i==1),limit&&i==num);
    }

    if(!limit) f[len][cnt]=res;
    return res;
}

int dp(int n)
{
    int len=0;
    while(n)
    {
        a[len++]=n%10;
        n/=10;
    }
    return dfs(len,0,1);
}

int main()
{
    memset(f,-1,sizeof f);

    cin>>n;

    cout<<dp(n)<<endl;
    //system("pause");
    return 0;
}

1049 Counting Ones (30 分)

标签:ems   状态   搜索   use   turn   nes   line   ++   模板题   

原文地址:https://www.cnblogs.com/fxh0707/p/14423958.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!