1. 程式人生 > >hdu6078 Wavel Sequence dp+二維樹狀數組

hdu6078 Wavel Sequence dp+二維樹狀數組

++ 單獨 tin wave namespace log 一模一樣 ace algo

//#pragma comment(linker, "/STACK:102400000,102400000")


/**
題目:hdu6078 Wavel Sequence
鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6078
題意:給定a序列和b序列。從a中取一個子序列x(數的位置順序保持不變),子序列每個數滿足a1<a2>a3<a4>a5<a6...  波浪形
從b中取相同長度的子序列y,也滿足波浪形。 如果x與y序列一模一樣,那麽找到一個匹配方式。
求a與b兩個序列有多少種匹配方式(相同的數但不同的位置,那麽算作不同)。

思路:
定義dp[i][j][k]表示x序列以a[i]為結尾,y序列以b[j]結尾,k=0表示a[i]是波谷,k=1表示a[i]是波峰時候的匹配方式。
容易想到
dp[i][j][0] = sigma(dp[x][y][1]), x<i,y<j,b[x]>b[i];    (a[i]==b[j],a[x]==b[y])
dp[i][j][1] = sigma(dp[x][y][0]), x<i,y<j,b[x]<b[i];
由於i的枚舉是最外圍循環,所以當前這個i要得到的結果來源前面計算過的,一定滿足x<i.所以x<i不用作為限制因素。
現在要考慮滿足y<j,b[x]>b[i]||b[x]<b[i]; 所以用二維樹狀數組維護y和b[x]。

定義c[j][value][k]表示y序列的結尾下標在j以內,數值大小value以內,波浪狀態為k時候的匹配方式數。

*/ #include<iostream> #include<cstdio> #include<algorithm> #include<map> #include<vector> #include<queue> #include<set> #include<cstring> #include<time.h> #include<random> #include<cmath> using namespace std; typedef pair<int,int> P; typedef
long long LL; const int mod = 998244353; const int INF = 0x3f3f3f3f; const int N = 2005; int n, m; int a[N], b[N]; int dp[N][2]; int c[N][N][2]; ///二維樹狀數組 int query(int i,int j,int flag) { int s = 0; for(int x = i; x > 0; x-=(x&(-x))){ for(int y = j; y > 0; y-=(y&(-y))){ s
= (s+c[x][y][flag])%mod; } } return s; } void update(int i,int j,int flag,int d) { for(int x = i; x <= 2000; x+=(x&(-x))){ for(int y = j; y <= 2000; y+=(y&(-y))){ c[x][y][flag] = (c[x][y][flag]+d)%mod; } } } int main() { int T; cin>>T; for(int i = 0; i<T; i++) { scanf("%d%d",&n,&m); for(int i = 1; i <= n; i++) scanf("%d",&a[i]); for(int i = 1; i <= m; i++) scanf("%d",&b[i]); memset(c, 0, sizeof c); LL ans = 0; for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ if(a[i]!=b[j]) continue; dp[j][0] = (query(j,2000,1)-query(j,b[j],1)+1+mod)%mod;///+1是因為每一個b[j]都可以單獨自身作為波谷,成為一個序列。 dp[j][1] = query(j,b[j]-1,0); ans = (ans+dp[j][0]) %mod; ans = (ans+dp[j][1]) %mod; update(j,b[j],0,dp[j][0]); update(j,b[j],1,dp[j][1]); } } printf("%lld\n",ans); } return 0; }

hdu6078 Wavel Sequence dp+二維樹狀數組