poj 1850 poj 1496

2022-08-05 15:33:15 字數 1125 閱讀 5874

-----------------

兩題解法類似。。

本題為組合數學的題,要求所給字串在排列中的位置。所用的方法為暴力列舉。

對於長度為1的字串有a,b,c,d.......26個;

長度為2的字串有 a開頭時有ab,ac,ad,ae,af.....(25,1) 25個 //()為組合數

b開頭時有bc,bd,de,.....(24,1) 24個

c開頭時有cd,ce,cf。。。(23,1) 23個

。。。。。。。

y開頭時有yz (1,1) 1個。

所以長度為2的字串共有 (25,1)+(24,1)+(23,1)+(22,1)。。。。=(26,2);

同理 長度為3時 共有 (26,3)個; 長度為4時有(26,4)個。。。。。

對於長度小於所給字串的串,,直接相加即可,。。而對於長度等於所給字串的串需要挨位列舉。。

例如:對於所給串為 dghei 長度等於它的串的個數應這樣列舉:

第一位,應從‘a’開始一直列舉到‘c’,,,但是對於‘a’來說 還有‘z’-‘a’個比‘a’大的字元,後邊還有4個位置空著,所以僅對於這一位來說是((‘z’-‘a’),4);

第二位, 應從比‘d’的字元開始列舉,因為題目要求是非降序列。。其他類似。。。

1 #include2 #include3

using

namespace

std;

4int c[27][27];5

intmain()

13 c[0][0] = 0;14

char str[15

];15

while(cin>>str)22}

23int sum = 0;24

for(int i=1;i//

比所求字串短的字串

25 sum += c[26

][i];

26//

列舉字串的每一位

27for(int i=0;i)33}

34 sum += 1;//

加上該字串本身,,因為之前最大就到該位-1

35 cout37return0;

38 }

poj 1496

這個題目的意思是給你一串沒有重複且遞增的只包含a z的字串, 讓你求出這個字串排在第幾位。 經過思考我們可以得出長度為n的字串的個數為c 2...

POJ 1850

1 include 2 include 3using namespace std 45 int fac int num 67 int c int n int m 8 int com int n int k 9int main 1025 cout 26 cout 28 cout for i 0 i s...

POJ1850

ac思路 可以把一個字串s 設其長度為len 所對應的數字看成排在其前面的所有字串的個數加一。 對於s,排在其前面的字串可以分成兩類 1 長...