2020 Niuke Duo School Six H. Harmony Pairs(Digital dp)

質問の意味:1 <= A <= B <= Nを見つけ、S(A)> S(B)(A、B)の対数を満たし、Sは数字の合計です。
ここに画像の説明を挿入

解決策:
デジタルdp、デジタルdpの範囲を見てください。

dp [pos] [d] [f 0] [f 1] dp [pos] [d] [f0] [f1] d p [ p o s ] [ d ] [ f 0 ] [ f 1 ]:現在の位置に対するdfsを表し、前の桁の差はd、BとNの関係はf0、AとBの関係はf1です。詳細については、注を参照してください。

その後、裸のデジタルDP。差はマイナスになる場合があります。d1000を右に移動します。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<fstream>
#include<set>
#include<map>
#include<sstream>
#include<iomanip>
#define ll long long
using namespace std;
const int mod = 1e9 + 7;
const int ini = 1000;
char s[111];
int a[111], dp[111][2111][2][2];
int dfs(int pos, int d, int f0, int f1) {
    
    
	if (pos == -1) return d > ini;
	if (dp[pos][d][f0][f1] != -1) return dp[pos][d][f0][f1];
	int up = f0 ? a[pos] : 9;   //B的之前位都与n之前位相同
	int ans = 0;
	for (int i = 0; i <= up; i++) {
    
           //B
		int up2 = f1 ? i : 9;             //A的之前位都与B之前位相同
		for (int j = 0; j <= up2; j++) {
    
      //A
			ans = (ans + dfs(pos - 1, d + j - i, f0 && (i == up), f1 && (j == up2))) % mod;
		}
	}
	dp[pos][d][f0][f1] = ans;
	return ans;
}
int solve() {
    
    
	int len = strlen(s);
	for (int i = 0; i < len; i++) {
    
    
		a[len - i - 1] = s[i] - 48;
	}
	return dfs(len - 1, ini, 1, 1);
}
int main() {
    
    
	memset(dp, -1, sizeof(dp));
	scanf("%s", s);
	cout << solve();
	return 0;
}

おすすめ

転載: blog.csdn.net/qq_43680965/article/details/107624251