记搜求调
查看原帖
记搜求调
664034
_xxxxx_楼主2024/7/25 15:46

rt,样例没过,观察到 sfd 一直返回 0。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
int l, r;
int a[25];
int dp[20][2][20][20];
int slen;
int dfs(int len, bool st, bool flag, int num, int lnum)
{
    if(len == -1)
    {
        if(lnum >= (slen / 2)) return 1;
        return 0;
    }
    if(st && ~dp[len][flag][num][lnum]) return dp[len][flag][num][lnum];
    int up = !flag ? a[len] : 9;
    int ans = 0;
    for(int i = 0; i <= up; i++)
    {
        if(i == 0 && st)
        {
            ans += dfs(len - 1, 1, (flag || i < up), num, lnum + (i == num));
        }
        else
        {
            ans += dfs(len - 1, 0, (flag || i < up), num, lnum + (i == num));
        }
    }
    if(st) dp[len][flag][num][lnum] = ans;
    return ans;
}
int f[15][2][15][15];
int sfd(int len, bool st, bool flag, int a1, int a2, int num1, int num2)
{
    if(len == -1)
    {
        if(a1 == a2 && num1 + num2 == slen) return 1;
        return 0;
    }
    if(st && ~f[len][flag][num1][num2]) return f[len][flag][num1][num2];
    int up = !flag ? a[len] : 9;
    int ans = 0;
    if(st)
        ans += sfd(len - 1, 0, flag, a1, a2, num1, num2);
    if(a1 <= up && (!st || a1))
        ans += sfd(len - 1, 1, (flag || a1 < up), a1, a2, num1 + 1, num2);
    if(a2 <= up && (!st || a2))
        ans += sfd(len - 1, 1, (flag || a2 < up), a1, a2, num1, num2 + 1);
    if(st) f[len][flag][num1][num2] = ans;
    return ans;
}
int calc(int x)
{
    int len = 0;
    while(x)
    {
        a[len++] = x % 10;
        x /= 10;
    }
    len--;
    int ans = 0;
    slen = len;
    for(int i = 0; i <= 9; i++)
    {
        memset(dp, -1, sizeof dp);
        ans += dfs(len, 1, 0, i, 0);
    }
    int oth = 0;
    for(int i = 1; i <= 9; i++)
    {
        for(int j = 0; j < i; j++)
        {
            memset(f, -1, sizeof f);
            oth += sfd(len, 1, 0, i, j, 0, 0);
        }
    }
    // cout << ans << " " << oth << endl;
    return ans - oth;
}
signed main()
{
    cin >> l >> r;
    printf("%lld\n", calc(r) - calc(l - 1));
    return 0;
}
2024/7/25 15:46
加载中...