hdu 5542(樹狀陣列優化dp)

2021-07-13 10:49:28 字數 977 閱讀 1185

題意: 

求n個數中長度為m的上公升子串行的個數 

解題思路:dp[i][j]表示第i個數長度為j的上公升序列的個數。dp[i][j] = sum,這裡的時間複雜度有o(n³),會超時,所以這裡要有優化。其實可以將a[i]離散化,對於每乙個j,構造乙個樹狀陣列,這樣求sum就可以用樹狀陣列的求和了,時間複雜度可以降為o(n²logn)。

#include#include#include#include#includeusing namespace std;

const int maxn = 1005;

const int mod = 1e9+7;

int n,m,dp[maxn][maxn];

int a[maxn],tree[maxn][maxn];

setset;

mapmap;

int lowbit(int x)

void add(int i,int j,int c)

}int sum(int i,int j)

return ans;

}int main()

int cnt = 0;

for(set::iterator it = set.begin(); it != set.end(); it++)

map[*it] = ++cnt;

memset(dp,0,sizeof(dp));

memset(tree,0,sizeof(tree));

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

for(int j = 1; j <= m; j++)

int ans = 0;

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

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

printf("case #%d: %d\n",cas++,ans);

} return 0;

}

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

hdoj5542 (樹狀陣列優化dp)

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

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的位置,其中第一層,第二層由於狀態方程是無法改變的,而第三層...