hdoj5542 (樹狀陣列優化dp)

2021-10-25 03:41:58 字數 1272 閱讀 7299

題目鏈結

題目大意:

給定乙個長度為n特定序列,要求出嚴格遞增的長度為m的子串行的方案數。

思路:設dp[i][j]為1-i中,存在長度為j且以a[i]結尾的方案數。

方程利用樹狀陣列維護1-i-1中長度為k的方案數即可優化。

**:

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

typedef

double db;

const

int mod=

1e9+7;

const

int maxn=

1e3+11;

const

double eps=

0.00000001

;int t,n,m,a[maxn]

;ll dp[maxn]

[maxn]

,c[maxn]

[maxn]

;struct db[maxn]

;bool

cmp(d x,d y)

intlowbit

(int x)

void

add(

int i,

int j,

int k)

}ll getsum

(int i,

int j)

return res;

}int

main()

sort

(b+1

,b+1

+n,cmp)

;int num=0;

for(

int i=

1;i<=n;

++i)

ll ans=0;

for(

int i=

1;i<=n;

++i)

add(j,a[i]

,dp[i]

[j]);}

ans=

(ans+dp[i]

[m])

%mod;

}printf

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

,++case,ans);}

return0;

}

hdu 5542(樹狀陣列優化dp)

題意 求n個數中長度為m的上公升子串行的個數 解題思路 dp i j 表示第i個數長度為j的上公升序列的個數。dp i j sum,這裡的時間複雜度有o n 會超時,所以這裡要有優化。其實可以將a i 離散化,對於每乙個j,構造乙個樹狀陣列,這樣求sum就可以用樹狀陣列的求和了,時間複雜度可以降為o...

POJ 5542 樹狀陣列優化DP

題意 給長度為n的陣列,問有多少長度為m單調遞增子串行?n,m 1000 思路 設f i j 表示長度為i的以aj為結尾的單調遞增子串行的方案數,易得f i j f i j f i 1 k ak 第一層列舉n,第二層列舉m,第三層列舉小於m的位置,其中第一層,第二層由於狀態方程是無法改變的,而第三層...

hdu5542 樹狀陣列 離散化 dp

推薦 通過離散化 樹狀陣列 優化 include using namespace std const int mod 1e9 7 const int maxn 1e3 60 int s maxn 最初的陣列 int e maxn 排序後的書序 int num maxn 儲存 離散化後的位置 int ...