hdu 2227 樹狀陣列 dp

2021-07-02 00:01:15 字數 1703 閱讀 9690

題意是求乙個數列的不遞減的子串行的個數;

很顯然,如果只用dp來做的話時間是o(n*n) 因為dp【i】為前i個數可能的方案,則狀態轉移方程為dp【i】=sum(dp【j】,j

先對num按數來進行排序,(這道題因為資料較大  用到了離散化) 因為更新是是按原序更新的,及i之前的num【j】一定比num【i】小,維護了不遞減的原則,更新是從mark【i】(表示原序列i在排序後的位置)開始更新 這就維護了子串行的原則,最後求和就行;

#include#include#include#includeusing namespacestd;#define mod 1000000007

structnodenum[100010];

intcmp(node a,node b)

intcont[100010],n;

intupdate(

inta,

intb)

return0;

}intfind(

inta)

returns;

}int

main

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

intk=-1,t=0;

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

mark[num[i].ii]=t;

}memset(cont,0,

sizeof

(cont));

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

printf("%d\n",find(n));

}return0;

}

hdu2227 樹狀陣列優化dp

hdu2227 find the nondecreasing subsequences 傳送門題意 有乙個長度為 n 1 leq n leq 100000 的數列,計算所有不下降子串行的個數,答案對 1e9 7 取模 題解 遞推式 dp i sum dp j 1,j 離散化之後遍歷序列,樹狀陣列維護...

hdu5489 樹狀陣列 dp

2015 10 06 21 49 54 這題說的是個給了乙個陣列,然後刪除任意起點的乙個連續的l個數,然後求最長遞增子串行 是遞增,不是非遞減 用乙個樹狀陣列維護一下就ok了 include include include include include using namespace std co...

hdu5125 樹狀陣列 dp

hdu5125 他說的是n個人每個人都有兩個氣球a,b,氣球各自都有相應的體積,現在讓他們按照序號排列好來,對他們的a氣球體積值計算最長上公升子串行,對於這整個排列來說有m次機會讓你將a氣球替換成b氣球 允許不使用完 問最後的最長上公升子串行 的長度是多少,哈哈,當然用dp的思想我們很容易就能知道狀...