zoukankan      html  css  js  c++  java
  • HDU-6148 Valley Number (数位DP)

    当一个数字,从左到右依次看过去数字没有出现先递增接着递减的“山峰”现象,就被称作 Valley Number。它可以递增,也可以递减,还可以先递减再递增。在递增或递减的过程中可以出现相等的情况。
    比如,1,10,12,212,32122都是 Valley Number。
    121,12331,21212则不是。
    度度熊想知道不大于N的Valley Number数有多少。
    注意,前导0是不合法的。
    每组数据包含一个数N。
    ● 1≤T≤200
    ● 1≤length(N)≤100
    结果对(1000000007)取模

    #include <bits/stdc++.h>
    using namespace std;
    const int mod = 1e9+7;
    typedef long long ll;
    int T;
    ll d[101][11][3];
    char s[101];
    int k[101],pos;
    /*
    减后可以增。增后不能减
    status : 
        0 不增不减
        1 增
        2 减
    */
    ll dfs(int pos,int pre,int status,bool lead,bool limit){
        if(pos == -1)return lead ? 0 : 1;
        if(!lead && !limit && d[pos][pre][status])return d[pos][pre][status];
    
        int up = limit ? k[pos] : 9;
        ll res = 0;
        for(int i=0;i<=up;i++){
            if(lead){
                if(i == 0){
                    (res += dfs(pos-1,0,0,true,false))%mod;
                }
                else{
                    (res += dfs(pos-1,i,0,false,limit && i == k[pos]))%mod;
                }
            }
            else{
                if(i < pre){
                    if(status == 1)continue;
                    (res += dfs(pos-1,i,2,false,limit && i == k[pos]))%mod;
                }
                else if(i == pre){
                    (res += dfs(pos-1,i,status,false,limit && i == k[pos]))%mod;
                }
                else{
                    (res += dfs(pos-1,i,1,false,limit && i == k[pos]))%mod;
                }
            }
        }
        if(!lead && !limit) d[pos][pre][status] = res % mod;
        return res;
    }
    ll solve(){
        int n = strlen(s);
        pos = 0;
        for(int i=n-1;i>=0;i--)k[pos++] = s[i]-'0';
        return dfs(pos-1,0,0,true,true);
    }
    int main(){
        scanf("%d",&T);
        while(T--){
            scanf("%s",s);
            printf("%lld
    ",solve()%mod);
        }
        return 0;
    }
    
  • 相关阅读:
    商贸通帐套隐藏方法
    固定资产打开提示:上年度数据未结转!
    ZOJ 2432 Greatest Common Increasing Subsequence
    POJ 1080 Human Gene Functions
    POJ 1088 滑雪
    POJ 1141 Brackets Sequence
    POJ 1050 To the Max
    HDOJ 1029 Ignatius and the Princess IV
    POJ 2247 Humble Numbers
    HDOJ 1181 变形课
  • 原文地址:https://www.cnblogs.com/1625--H/p/11269239.html
Copyright © 2011-2022 走看看