編碼問題
題意就是a,b,c.....ab.....編碼,給你乙個字串,輸出這是第幾個;
這裡可以用暴力列舉,但也可以用組合數學的高超知識;
既然這樣我就說一下排列組合的方法,如果要弄乙個 各位數字遞增的三位數,只需要在乙個有序數列裡面取三個數字,此時就無需關注順序,因為順序只能是公升序的。比如0 1 2 3 4 5 6 7 8 9。取得9 5 8 那麼他的順序就只能是589。總數就是c(x,y),x代表位數,y代表可供選擇的數的長度,
就像例子中是c(3,10)。對於字母排列,道理也是一樣。只需要注意一下y的大小,然後從左到右一步一步推下去就好。
#include #include#include
#include
#include
using
namespace
std;
int f[27][100
];int d[7
];string
str;
intmain()
int l =str.length();
for(int i=0; i)
//特判不存在的情況
}
if(l==0)
if(l==1)
//累加長度小於l的可能性;
int sum = 0
;
for(int i=1; i)
//下面是求l位數的前面; 如:bdf 先計數a*的個數 再bc*的個數 再bd
for(int i=0;i1;i++)
}else}}
sum+=d[l-1]-d[l-2]; //
比如bde到bdf有2個,這個需要加上去。
coutreturn0;
}
搜尋和組合數學P1246 編碼
題目鏈結p1246 編碼 如果給出的字串字母不遞增,則輸出 0 否則輸出對應編號。首先資料範圍很小。先簡單算一下,用組合數計算出每乙個長度能編號的字串數目。把 6 個組合數加起來編號就是 313911 即最後乙個字串 mathrm 的編號,完全可以列舉每乙個可以編號的字串,找到匹配的就輸出編號即可,...
P2386 放蘋果(排列組合問題)
目錄dp dfs把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分發 5,1,1和1,1,5是同一種方法 輸入格式 第一行是測試資料的數目t 0 t 20 以下每行均包括二個整數m和n,以空格分開。1 m,n 10 輸出格式 對輸入的每組資料m和n,用一行輸出相應的k。...
洛谷 P1706 全排列問題
題目描述 輸出自然數 11 到 nn 所有不重複的排列,即 nn 的全排列,要求所產生的任一數字序列中不允許出現重複的數字。輸入格式 乙個整數 nn。輸出格式 由 1 sim n1 n 組成的所有不重複的數字序列,每行乙個序列。每個數字保留 55 個場寬。輸入輸出樣例 輸入 1 複製 3輸出 1 複...