牛客第六场

H Harmony Pairs

p o s pos pos代表枚举到的位数, s u m sum sum代表到当前位 S ( A ) − S ( B ) S(A) - S(B) S(A)S(B)的值, B N BN BN代表 B B B N N N的大小关系, A B AB AB代表 A A A B B B的大小关系
采用DP_MAX,是因为 s u m sum sum可能出现负值

#include 

using namespace std;
const int mod = 1000000007;
const int DP_MAX = 2005;
string s;
int n;
int dp[105][DP_MAX * 5][2][2];
int dfs(int pos, int sum, int BN, int AB)
{
    // cout << "pos = " << pos << '\n';
    if (pos == n)
        return sum > DP_MAX;
    if (dp[pos][sum][BN][AB] != -1)
        return dp[pos][sum][BN][AB];

    int i_up = BN ? s[pos] - '0' : 9;
    int ans = 0;
    for (int i = 0; i <= i_up; i++)
    {
        int j_up = AB ? i : 9;
        for (int j = 0; j <= j_up; j++)
        {
            ans = (ans + dfs(pos + 1, sum + j - i, (i >= (s[pos] - '0')) & BN, (j >= i) & AB) % mod) % mod;
        }
    }
    return dp[pos][sum][BN][AB] = ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    memset(dp, -1, sizeof dp);
    cin >> s;
    n = s.size();
    int ans = dfs(0, DP_MAX, 1, 1);
    cout << ans << '\n';
    // cin >> s;
}

你可能感兴趣的:(2020牛客多校)