陕西省建设集团公司网站,小学生手工制作大全,wdcp 无法访问此网站,新乡网站优化平台正题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid5542 题目大意
求序列A有多少个长度为M的递增子序列。 解题思路
用fi,jfi,j表示长度为i#xff0c;以AjAj结尾的序列的个数。然后显然得出动态转移方程通过上一次从任意一个地方转移#xff0c;动态转移方程5542 题目大意
求序列A有多少个长度为M的递增子序列。 解题思路
用fi,jfi,jf_{i,j}表示长度为i以AjAjA_j结尾的序列的个数。然后显然得出动态转移方程通过上一次从任意一个地方转移动态转移方程
fi,j∑kj,AkAjfi−1,kfi,j∑kj,AkAjfi−1,k
f_{i,j}=\sum_{k 我们可以用树状数组储存和维护k。code
#includecstdio
#includealgorithm
#includecstring
#define N 2010
#define lowbit(x) x-x
#define BPM 1000000007
using namespace std;
int t[N],a[N],f[N][N],n,m,l,uiqe[N],ans,ts;
void change(int x,int k)
{while(xl){t[x](t[x]k)%BPM;xlowbit(x);}
}
int ask(int x)
{int sum0;while(x){sum(sumt[x])%BPM;x-lowbit(x);}return sum;
}
int main()
{scanf(%d,ts);for(int ti1;tits;ti){scanf(%d%d,n,m);a[0]-2147483647;uiqe[n1]a[0];for(int i1;in;i)scanf(%d,a[i]),uiqe[i]a[i];sort(uiqe1,uiqe2n);lunique(uiqe1,uiqe1n)-(uiqe1);for(int i0;in;i)a[i]lower_bound(uiqe1,uiqe1l,a[i])-uiqe;//以上为离散化memset(f,0,sizeof(f));f[0][0]1;ans0;for(int i1;im;i){memset(t,0,sizeof(t));change(a[0],f[i-1][0]);//修改for(int j1;jn;j){f[i][j]ask(a[j]-1);//询问和change(a[j],f[i-1][j]);//维护和if(im) ans(ansf[i][j])%BPM;}}printf(Case #%d: %d\n,ti,ans);}
}