POJ 5542 樹狀陣列優化DP

2022-06-03 06:39:07 字數 1200 閱讀 1832

題意:給長度為n的陣列,問有多少長度為m單調遞增子串行? n,m<=1000

思路:設f[i][j]表示長度為i的以aj為結尾的單調遞增子串行的方案數,易得f[i][j]=f[i][j]+f[i-1][k] (ak

第一層列舉n,第二層列舉m,第三層列舉小於m的位置,其中第一層,第二層由於狀態方程是無法改變的,而第三層列舉小於m的位置的所有小於a[j]的值都是要計算的,所以可以使用樹狀陣列,以a[j]作為下標,f[i][j]為對應的值,這樣每一層來說統計上一層中小於a[j]的個數,就是樹狀陣列中的字首和了,然後到了下一層在更新樹狀陣列就可以。

#includeusing

namespace

std;

#define ll long long

const

int maxn=1e3+10

;const

int mod=1e9+7

;ll c[maxn];

struct

note

a[maxn];

intpos[maxn];

int f[1005][1005

];int

cmp(note a,note b)

intn,m;

ll ask(

intx)

void add(int x,int

y)int

main()

sort(a+1,a+1+n,cmp);

for(int i=1; i<=n; i++)

pos[a[i].id]=i;

memset(f,

0,sizeof

(f));

memset(c,

0,sizeof

(c));

for(int i=1; i<=n; i++)

f[1][i]=1

;

for(int i=2; i<=m; i++)

memset(c,

0,sizeof(c)); //

清空

} ll ans=0

;

for(int i=1; i<=n; i++)

ans=(ans+f[m][i])%mod;

printf(

"case #%d: %lld\n

",it,ans);}}

view code

hdu 5542(樹狀陣列優化dp)

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

hdoj5542 (樹狀陣列優化dp)

題目鏈結 題目大意 給定乙個長度為n特定序列,要求出嚴格遞增的長度為m的子串行的方案數。思路 設dp i j 為1 i中,存在長度為j且以a i 結尾的方案數。方程利用樹狀陣列維護1 i 1中長度為k的方案數即可優化。include include include include include i...

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 ...