計數問題 數字統計DP(c )

2021-10-12 21:44:46 字數 2678 閱讀 9918

acwing 338. 計數問題

給定兩個整數 a 和 b,求 a 和 b 之間的所有數字中0~9的出現次數。

例如,a=1024,b=1032,則 a 和 b 之間共有9個數如下:

1024 1025 1026 1027 1028 1029 1030 1031 1032

其中『0』出現10次,『1』出現10次,『2』出現7次,『3』出現3次等等…

輸入格式

輸入包含多組測試資料。

每組測試資料佔一行,包含兩個整數 a 和 b。

當讀入一行為0 0時,表示輸入終止,且該行不作處理。

輸出格式

每組資料輸出乙個結果,每個結果佔一行。

每個結果包含十個用空格隔開的數字,第乙個數字表示『0』出現的次數,第二個數字表示『1』出現的次數,以此類推。

資料範圍

0110

44497

346542

1199

1748

1496

1403

1004

5031714

1901317

8541976

4941001

1960

00輸出樣例:

121

1111

11185

185185

185190

9696

9695

9340

4040

93136

8240

4040

40115

666215

215214

205205

154105

10616

11319

20114

2020

1919

16107

105100

101101

197200

200200

200413

1133

503503

503502

502417

402412

196512

186104

8793

9797

142196

3981375

398398

405499

499495

488471

2941256

296296

296296

287286

286247

列舉情況:

//假設n

=abcdefg//

求每一位是t的情況是多少//

當t==

0時,不能有前導全

0//d不能在a的位置

//當d==

t時:(001

~abc-1)

0*10^

(efg)+

abc0

(000

~efg)/

/當d>t時:

(001

~abc)t

*10(efg)/

/當d<

t時,不存在//

當t!=

0時,可以有前導全

0//當d=

=t時:(

000~

abc-1)

t*10^

(efg)+

abct

(000

~efg)/

/當d>t時:

(000

~abc)t

*10^(

efg)//

當d(000

~abc-1)

t*10^

(efg

)

#include

#include

#include

using

namespace std;

const

int n =10;

/*001~abc-1, 999

abc 1. num[i] < x, 0

2. num[i] == x, 0~efg

3. num[i] > x, 0~999

*/int

get(vector<

int> num,

int l,

int r)

//算出陣列num第r位到第l位的數是多少

intpower10

(int x)

//求10的i次方

intcount

(int n,

int x)

//1~n中數字k出現的次數

n = num.

size()

;int res =0;

for(

int i = n -1-

!x; i >=

0; i --)if

(num[i]

== x) res +

=get

(num, i -1,

0)+1

;else

if(num[i]

> x) res +

=power10

(i);

}return res;

}int

main()

return0;

}

計數問題(數字dp)

給定兩個整數 a 和 b,求 a 和 b 之間的所有數字中0 9的出現次數。例如,a 1024,b 1032,則 a 和 b 之間共有9個數如下 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出現10次,1 出現10次,2 出現7次,3 出現3次...

數字DP 計數問題

題目鏈結 第一次做真的很難,總之十分耗費時間。include include include using namespace std const int n 10 get前面字首部分的數值,即前面字首總方案數 intget vector int num,int l,int r 字尾有幾位就是十的幾次...

AcWing 338 計數問題(數字統計dp)

acwing 338.計數問題 給定兩個整數 a 和 b,求 a 和 b 之間的所有數字中0 9的出現次數。例如,a 1024,b 1032,則 a 和 b 之間共有9個數如下 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出現10次,1 出現1...