絕 zhen 世 xiang 好題題解

2021-10-07 06:26:31 字數 1546 閱讀 5591

我好菜啊

我是真的菜(╥╯^╰╥),撓了半天的頭,還是只想到了o(n * n)的演算法 不過騙了80分, 頭 撓得 疼的實在受不了,搜了一下題解,看了之後看懂了,可覺得講的不是很詳細,秉承著不浪費每一道題的 素質 精神,我決定寫篇blog,希望這樣也能讓我記憶深刻。

ps:黎老師連題目名都不改的嗎,我搜尋能力這麼差都搜到了

f[i][j] = max(f[i - 1][k])  (a[i]在二進位制表示下,第j, k位為1)

f[i - 1][j] (a[i]在二進位制表示下,第j位為0)

我們定義f[i][j]為:在前i個數中選擇,以在二進位制表示下,第j位為1的數結尾的最長的序列長度。

那麼我們分析一下f[i][j]會由哪些狀態轉移過來。

1.第i個數在二進位制表示下的第j位為1

那麼第i個數可以作為f[i][j]的末尾(因為第j位在"&"之後肯定是1)

所以f[i][j] = f[i - 1][j] + 1; (???)

no!因為只需關注序列中最後兩個數(因為前面的都是滿足要求的),所以只要在二進位制表示下,最後的兩數有同一數字(二進位制表示下)為1就可以滿足要求,那麼我們就只需要在滿足要求的方法中選最大值

所以 f[i][j] = max(f[i - 1][k]) (a[i]在二進位制表示下,第k位為1)

2.不為1

這種比較簡單,就是:f[i][j] = f[i - 1][j];

所以狀態轉移方程為

f[i][j] = max(f[i - 1][k])  (a[i]在二進位制表示下,第j, k位為1)

f[i - 1][j] (a[i]在二進位制表示下,第j位為0)

最後加個滾動陣列,減少判斷和**量。

細節參考**

#include

const

int maxlen =

105;

const

int maxn =

100005

;const

int inf =

0x3f3f3f3f

;int n, ans =

-inf, a[maxn]

;int f[maxlen]

;//f[i][j]表示在前i個中選,選出來的數的最後乙個,在二進位制表示下,第j位為1的最長序列長度

intmax

(int x,

int y)

intmain()

for(

int j =

1; j <=

32; j++)if

((a[i]

>>

(j -1)

&1)==

1) f[j]

=max

(f[j]

, _max)

;//第i個數的第j位為1,可以作為f[j]的末尾

ans =

max(ans, _max);}

printf

("%d"

, ans)

;return0;

}

51nod 1287 加農炮 好題啊好題

1287 加農炮 codility 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 乙個長度為m的正整數陣列a,表示從左向右的地形高度。測試一種加農炮,炮彈平行於地面從左向右飛行,高度為h,如果某處地形的高度大於等於炮彈飛行的高度h a i h 炮彈會被擋住並落在...

貪心 好題 Yogurt factory

題目 任務規定,乙個酸奶製造廠,在n個星期內,分別要向外提供y i unit的酸奶。已知這個製造廠第i周製造每unit酸奶的費用為c i 儲存室儲存每1unit酸奶1星期的費用為s。問要完成這個任務的最小費用是多少。來自 思路 等價的思路,在第n天的時候,第n 2天製造的酸奶可以看成第n 1天製造的...

4300 絕世好題

time limit 1 sec memory limit 128 mb submit 1328 solved 724 submit status discuss 給定乙個長度為n的數列ai,求ai的子串行bi的最長長度,滿足bi bi 1 0 2 i len 輸入檔案共2行。第一行包括乙個整數n。...