当时比赛时超时了,那时没学过树状数组,也不知道啥叫离散化(貌似好像现在也不懂)。百度百科——离散化,把无限空间中无限的个体映射到有限的空间中去,以此提高算法的时空效率。

这道题是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 }
View Code

相关文章: