AcWing 297 赤壁之戰

2021-09-29 06:54:10 字數 2027 閱讀 4511

很容易想到乙個dp:f[i

][j]

f[i][j]

f[i][j

]表示長度為i

ii,以a[j

]a[j]

a[j]

結尾的上公升子串行的個數

轉移的話就是從1

11到m

mm列舉乙個i

ii表示長度,再從1

11到n

nn列舉乙個j

jj,再從1

11到j−1

j-1j−

1列舉乙個k

kk轉移就是如果a[k

]

i]

a[k]a[

k]i]

,表示i

ii可以接在k

kk後面,那麼f[i

][j]

+=f[

i−1]

[k

]f[i][j]+=f[i-1][k]

f[i][j

]+=f

[i−1

][k]

複雜度θ(n

2m

)\theta(n^2m)

θ(n2m)

,可以過這個1000

1000

1000

的顯然不是正解,那麼我們需要優化掉一層列舉

對於最後一層從1

11到j−1

j-1j−

1,其實就是對f[i

−1][

k](0

<

k

f[i-1][k](0f[

i−1]

[k](

0<

k的乙個求和,可以樹狀陣列log

loglo

g求所以說這是乙個資料結構優化dp

不是正解:

#include

#define a 1010

using

namespace std;

typedef

long

long ll;

const

int mod =

1e9+7;

int n, a[a]

, b[a]

, f[a]

[a], t, m;

intmain

(int argc,

char

const

*ar**)

int ans =0;

for(

int i =

1; i <= n; i++

) ans =

(ans + f[m]

[i])

% mod;

printf

("case #%d: %d\n"

, cas, ans);}

}

加了樹狀陣列:

#include

#define a 1010

using

namespace std;

const

int mod =

1e9+7;

int n, a[a]

, b[a]

, f[a]

[a], t, m, t[a]

;int

lowbit

(int x)

void

add(

int x,

int val)

intask

(int x,

int ans =0)

intmain

(int argc,

char

const

*ar**)

int ans =0;

for(

int i =

1; i <= n; i++

) ans =

(ans + f[m]

[i])

% mod;

printf

("case #%d: %d\n"

, cas, ans);}

}

AcWing 29 刪除鍊錶中重複的節點

題目描述 在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留。樣例1輸入 1 2 3 3 4 4 5 輸出 1 2 5樣例2 輸入 1 1 1 2 3 輸出 2 3分析 本題與一般去重不同之處是 對於重複的元素,乙個不留。於是很可能刪除後,鍊錶為空。為了防止頭結點被刪,我...

AcWing 29 刪除鍊錶中重複的節點

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留。樣例1輸入 1 2 3 3 4 4 5 輸出 1 2 5樣例2 輸入 1 1 1 2 3 輸出 2 3先建立乙個dummy節點,然後cur等於dummy節點,pre節點等於head。然後先判斷是否head的next節點為...

29 陣列操作

為了鞏固所有學習到的繼承 方法的覆寫概念,下面通過具體的例項來進行說明 要求定以乙個陣列操作類 array類 在這個類裡面可以進行整型陣列的操作,由外部傳入陣列的大小要求實現資料的儲存以及資料的輸出,隨後在這個類上派生出兩個子類 排序類 通過此類取得的資料可以進行排序 反轉類 通過此類取得的的陣列的...