題目鏈結
題目大意:
給定乙個長度為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 ...