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