2020牛客暑期多校训练营(第六场) H

Harmony Pairs

解法:数位DP

方程:dp[x][d][p][q]   

表示状态 :A,B的第x位数之前的数位和差值为d (sumA-sumB),p=1表示B当前位最大只能取N[x],p=0,表示B当前位可任意取,q=1表示A当前A==B所以当前位最大只能取和B位相同的数,q=0表示A

#include
#define mod 1000000007
using namespace std;
char s[105];
int num[105];
int M=1000;
long long dp[105][2005][2][2];
long long dfs(int x,int d,int p,int q)
{
//    puts("99");
    long long ans=0;
    if(!x) return (d>M?1ll:0*1ll);
    if(dp[x][d][p][q]!=-1) return dp[x][d][p][q];
    for(int i=0;i<=(p?num[x]:9);i++)//B
    {
        for(int j=0;j<=(q?i:9);j++)//A
        {
            ans=(ans+dfs(x-1,d+j-i,p&(i==num[x]),q&(i==j)))%mod;
        }
    }
    return dp[x][d][p][q]=ans;
}
int main()
{
    scanf("%s",s);
    memset(dp,-1,sizeof(dp));
    int len=strlen(s);
    for(int i=0;i

 

你可能感兴趣的:(2020牛客暑期多校训练营(第六场) H)