我好菜啊
我是真的菜(╥╯^╰╥),撓了半天的頭,還是只想到了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。...