アルゴリズム-デジタルdp

  • 注:この記事の間隔はすべて閉じた間隔です

  • LDUデジタルdpの練習

  • 説明ビデオ
    00:00 − − \ small 00:00-〜0 00 0- デジタルdp \スモールdpd p原理説明
    02:50 − − \ small 02:50-〜0 25 0 「度数」思考列
    21:40 − − \ small 21:40-〜2 14 0 「度数」コード説明
    36:20 − − \ small 36:20-〜3 62 0 「ナンバーゲーム」のアイデアの
    説明48:00 − − \ small 48:00-〜4 80 0 「ナンバーゲーム」コードの説明
    56:50 − − \ small 56:50-〜5 65 0 「風の数」の考え方
    65:00 − − \ small 65:00-〜6 50 0 「ウィンディナンバー」コード説明
    83:30 − − \ small 83:30-〜8 33 0 「ナンバーゲームII」思考の列車
    94:20 − − \ small 94:20-〜9 42 0 「ナンバーゲームII」コード説明
    104:10 − − \ small 104:10-〜1 0 41 0 「62ではない」思考の
    流れ115:10 − − \ small 115:10-〜1 1 51 0 「62しない」コードの説明
    127:40 − − \ small 127:40-〜1 2 74 0 「妻を壊すために7が嫌い」145を説明する思考の
    流れ:10 − − \ small 145:10-〜1 4 51 0 「憎しみ7が結婚しない」コードの説明

  • デジタルdpによって解決される問題:与えられた間隔を見つける[L、R] \ small [L、R][ L R ]、関数f(x)\ small f(x)に沿ってf x の数。
    例:
    f(x)\ small f(x)f x :数を減らさない-x \ small xxは、左から右への数字が以下であるという関係を満たす必要があります。以下のような123 \ 123小さな1 2 3446 \ small4464 4 6
    L = 1 \ small L = 1L=1、\ small、 R = 19 \ small R = 19R=1 9
    回答:18 \ small 181 8
    説明:10 \small10のみ1 0は非減少数ではなく、残りは非減少数であるため、答えは18 \small18です。1 8

  • デジタルdpスキル
    1、1、1 dp(L、R)= dp(0、R)− dp(0、L − 1)\ small dp(L、R)= dp(0、R)-dp(0、L-1)d p L R =d p 0 R d p 0 L1
    については[L、R] \小さな[L、R][ L R ]間隔の問題、通常は2次のdp \ smalldpに変換しますd p、つまり[0、R] \ small [0、R]を見つけます[ 0 R ]および[0、L − 1] \ small [0、L-1][ 0 L1 ] 2つの段落、次に結果を減算して、必要な[L、R] \ small [L、R]を取得します[ L R ]
    例:区間2、2の合計を接頭辞の合計で求めます
    2 絵画の木

  • テンプレート

#include<vector>
#include<iostream>
using namespace std;

const int N = 100;

int f[N][N];
int u[N];

//根据题目要求来预处理f[i][j]
void init() {
    
    

}
//计算[0,n]符合f(x)的个数
int dp(int n) {
    
    
	//如果L可以取到0的话,特判-1
	if (n == -1) return 0;
	//特判0
	if (n == 0) return 0 / 1;

	//用于把每位的数字提取出来
	vector<int> vt;
	while (n) vt.push_back(n % 10), n /= 10;

	//res记录返回值,last保留前缀的信息
	int res = 0, last = 0;
	for (int i = vt.size() - 1; i >= 0; i--) {
    
    
		//第一种放法
		for (int j = 0; j < vt[i]; j++) {
    
    
			if (true) res += f[][];
		}
		//第二种放法就是vt[i]本身,特判vt[i]是否和法,不合法直接退出就好
		if (false) break;
	}

	//返回答案
	return res;
}
int main() {
    
    

	//预处理需要的数据
	init();

	int l, r;
	while (cin >> l >> r) {
    
    
		//技巧一
		cout << dp(r) - dp(l - 1) << endl;
	}
	return 0;
}

おすすめ

転載: blog.csdn.net/qq_45739057/article/details/107287765