牛客多校6 - Harmony Pairs(数位dp)

题目链接:点击查看

题目大意:给出一个数字 n ,规定 S( x ) 为数字 x 的数位和,现在问有多少对 ( A , B ) ,满足 A <= B 且 S( A ) > S( B )

题目分析:数位dp,比赛时没有来的及开这个题,或许开了这个题也做不出来。。

dp[ pos ][ delt ][ flag1 ][ flag2 ] :

  1. pos:第 pos 位
  2. delt:S( A ) 和 S( B ) 的差值
  3. flag1:B <= N?
  4. flag2:A <= B?

剩下的就是模板了

代码:
 

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
  
typedef long long LL;
  
typedef unsigned long long ull;
  
const int inf=0x3f3f3f3f;
 
const int N=110;

const int mod=1e9+7;

LL dp[110][2100][2][2];//dp[len][delt][B<=N?][A<=B?]:len:长度,delt:suma与sumb之差

char s[N];

int a[N],n;

LL dfs(int pos,int delt,bool flag1,bool flag2)
{
	if(pos==n)
		return delt>1000;
	if(dp[pos][delt][flag1][flag2]!=-1)
		return dp[pos][delt][flag1][flag2];
	LL ans=0;
	for(int i=0;i<=(flag1?a[pos]:9);i++)//枚举B
		for(int j=0;j<=(flag2?i:9);j++)//枚举A
			ans=(ans+dfs(pos+1,delt+j-i,flag1&&i==a[pos],flag2&&j==i))%mod;
	return dp[pos][delt][flag1][flag2]=ans;
}

int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);
	memset(dp,-1,sizeof(dp));
	scanf("%s",s);
	n=strlen(s);
	for(int i=0;i

 

你可能感兴趣的:(数位dp)