POJ 2229 Sumsets(遞推,找規律)

2022-04-04 07:45:53 字數 842 閱讀 9164

構造,遞推,因為劃分是合併的逆過程,考慮怎麼合併。

先把n展開成全部為n個1

然後合併,因為和順序無關,所以只和出現次數有關

情況有點多並且為了避免重複,分類,c[i]表示序列中最大的數為2^i時的方案數

樹形表示合併 (uva 10562 undraw the trees的表示方法。。。

7          (2^0) (7表示2^0出現的次數)

_ _ _

|  |  |

1 2 3    (2^1) (7個1可以合併成1~3個2)

_ _|  |

1 1         (2^2) (繼續合併)

這棵樹是分形的,子樹的形態由根結點的值決定。

f[n]表示方案

當n是偶數,第一層會增加一顆子樹 其值為 n/2, f[n] = f[n-1]+f[n/2] 

當n是奇數,樹的形態不變 ,f[n] = f[n-1]

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int mod = 1e9, maxn = 1e6+1

;int

dp[maxn];

//#define local

intmain()

cout

return0;

}

POJ 2229 Sumsets(找規律,預處理)

題目 參考了別人找的規律再理解 8 1 1 1 1 1 1 1 1 1 1 8 1 1 1 1 1 1 1 2 2 3 8 1 1 1 1 2 2 8 1 1 1 1 4 4 5 8 1 1 2 2 2 8 1 1 2 4 6 7 8 2 2 2 2 8 2 2 4 8 4 4 8 8 8 9 以下...

POJ2549 Sumsets 折半列舉

題目大意是,乙個集合中有n個元素,找出最大的s,滿足條件a b c s,並且這四個數都屬於該集合,n不超過1000.如果直接列舉o n 4 顯然複雜度太高,將等式轉化一下a b s c,此時分別對左右兩邊的值進行列舉,這一步複雜度為o n 2 接著就用二分法查詢滿足該等式的最大s值,複雜度為o n ...

POJ 2549 Sumsets 折半列舉

題意 在集合s中有n個數,找到最大的d,且d滿足於集合內a b c d。題解 我們把找a b c d化為找 a b d c。設c為a,b,c中最大的元素。注意d不一定比c大,d c可以為負數。這樣我們列舉d,c,利用二分的思想查詢a,b。如下 include include include defi...