注意,我的**和紫書**不一樣。
首先來說一下我的**與紫書所給的**的區別。
我的**不是對編碼頭做處理,而是對編碼資訊(也就是二進位制需解碼的資訊)進行處理,使其與編碼頭一一對應。
怎麼說呢,我覺得我的**有思考的過程,我覺得有必要寫一下。
思路:例子:編碼頭:abcdefghijklmn
我希望達成的目的是編碼頭直接用字串來儲存,即code="abcdefghijklmn"
然後解碼時,0對應code[0],00對應code[1]。即將編碼資訊轉換為code的下標
我們會發現乙個特點,編碼資訊每次多一位數時,其值會從0開始。
注意00前面有1個數(0),000前面有4個數,000前面有11個數。
如果我們把資訊編碼的值加上00...0前有幾個數,那麼最後的結果就和下標是一樣的了。
那麼00...0(n個0)前面有幾個數呢?
我們先考慮00...0(n-1個)到11...1(n-1個)有幾個數
即11...1的值加上1(00...0),也就是2^(n-1).
不過11...1不能算在其中,故應該是2^(n-1)-1
那麼00...0(n個0)之前應該有
故下標值=編碼資訊值(二進位制要轉換成十進位制)+(n為編碼首席資訊官度)+
這樣問題就解決了。
附上我的**:
#include #include using namespace std;
char code[256];
int readchar()
}int read_binary(int length)
int main()
{ while(fflush(stdin),fgets(code,256,stdin))
{if(code[0]=='\n'||code[0]=='\r')
continue;
int len,idx;
while(len=read_binary(3),len)
{while(idx=read_binary(len),idx!=(1<
紫書 例題 10 13 UVa 830(遞推)
首先我們按照這三個u的位置來分類,當前三個u在i,i 1,i 2。那麼先看三個u前面,前面不能有三個u,因為我們不能重複計算 那麼就是所有的組合減去有u的情況 為了敘述方便,我們設答案為f n 沒有三個u的方案數為 g n 那麼顯然g n 2的n次方 f n 然後我們看三個u後面,後面就任意了是2的...
紫書 例題8 2 UVa 11605(構造法)
這道題方法非常的巧妙,兩層的n n,第一層第i行全是第i個國家,第二層的第j列全是第j個國家。這樣能符合題目的條件。比如說第1個國家,在第一層的第一行全是a,然後在第二層的第一行就有abcde 這樣a就和所有的國家都連線了,其他國家也是一樣的。只能說這種方法非常巧妙吧,答案講出來很簡單,但是不容易想...
紫書 例題8 7 UVa 11572(滑動視窗)
滑動視窗這個方法名字非常形象,先是視窗的右指標盡量往右滑,滑不動了就滑視窗的左指標,滑到右指標又可以開始滑動為止。這道題是要記錄滑的過程中最大的視窗長度,限制條件是視窗中不能出現重複的值。重複的值有兩種判斷方法。一種是set,其實就是開個vis陣列,但是資料有10的六次方,陣列肯定開不下,所以用se...