当时比赛时超时了,那时没学过树状数组,也不知道啥叫离散化(貌似好像现在也不懂)。百度百科——离散化,把无限空间中无限的个体映射到有限的空间中去,以此提高算法的时空效率。
这道题是dp题,离散化和树状数组用来优化,状态转移方程:dp[i][j]=sum(dp[i-1][k])----k需要满足a[j]>a[k]&&k<j;
i表示所要选的个数,j表示以第a[j]个数结尾所有的符合要求的递增串的个数,最后答案就是sum(dp[n][j])--1<=j<=p;n 为要选的个数,p为所给数的总数,这个方程很容易想,这里不说了
(因为叫我说也说不清)。
数据肯定很大所以题目要求取模。
今天刚学树状数组还不太会用。
下面给出树状数组的模板
1 int bit[MAX_N+1],n; 2 int sum(int i) 3 { 4 int s=0; 5 while(i>0) 6 { 7 s+=bit[i]; 8 i-=i&-i; 9 } 10 return s; 11 } 12 13 14 void add(int i,int x) 15 { 16 while(i<=n) 17 { 18 bit[i]+=x; 19 i+=i&-i; 20 } 21 }