poj1850組合數學

2021-08-06 05:12:47 字數 1168 閱讀 9220

題意:給你乙個字串s,輸出s在字典序全排列中的位置(從小到大排列)。

思路:長度為m的字串有c(26,m),這是顯而易見的,從26個字母中挑m個,因為要公升序排列,所以只有一種排法,即c(26,m)為個數;這樣我們就可以求出長度比字串s小的字串有多少個。len為字串s的長度。

長度相同但排在字串s前面的有多少個?對於 s 的每一位 s[i] 和左邊相鄰的 s[i-1],如果s[i] > s[i-1],說明當前位置s[i] 至少

比前一位的 s[i-1] 大。

答案 sum 要加上用比 s[i]大的字母構成長度為 len-1-i 的字串個數,即 c[26-ch][len-1-i]。ch 從 s[i] 到 s[i-1] + 1。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define maxn 33000

#define inf 0x3f3f3f3f

#define lmid l,m,rt<<1

#define rmid m+1,r,rt<<1|1

#define ls rt<<1

#define rs rt<<1|1

#define mod 1000000007

#define i64 __int64

#define limit_ull 100000000000000000

#define max(a,b) (a>b)?a:b

#define lowbit(x) x&(-x)

using

namespace

std;

typedef

long

long ll;

char s[15];

int c[30][15];

void deal()

}int main()

ll sum=0;

for(int i=1;i26][i];

for(int i=0;i//i為s的指標,對每乙個位置列舉 允許選擇的字元ch

}cout

<<++sum}

POJ 1850 Code 組合數學)

題意 求str在字典中的編號。字典中的字串都是嚴格公升序排列,而且長度遞增的。a z為1 26,然後是ab az 分別編號為27 51,然後是bc bz。分析 1 首先可以確定長度比str小的總共有多少個。比如長度為2的就有c 26,2 個,相當於26個字元中選2個,由於預設是公升序排列,不會重複,...

組合數學 POJ 1850 Code

poj 1850 比如說求比358小的由1 9的數字組成的數 0不算 而且要求後面乙個數一定比前乙個數大,而且數字不能重複,類似於這個意思,這題是字母,當做數字範圍1 26就行 對於358來說 c 9,2 c 9,1 c 7,2 c 8,2 c 6,2 不想寫了,應該沒算錯 兩位數和一位數,一定比 ...

POJ 1850 code 組合數學

poj 1850 code 將字母和單詞 全部小寫並且按照字典序遞增 按照字典序編號,比如 a 1 b 2 z 26 ab 27 az 51 給你乙個字母或單詞,問你它的編號 以樹狀的結構來分析這道題會比較直觀。按照樹的節點依次編號,每個字母或單詞就落在乙個節點上。要求乙個單詞的編號,比較直接的想法...