子序列
题目链接
题解链接
题目描述
小美有一个由
n 个元素组成的序列
{a1,a2,a3,...,an},她想知道其中有多少个子序列
{ap1,ap2,...,apm}(1≤m≤n,1≤p1<p2,...,<pm≤n),满足对于所有的
i,j(1≤i<j≤m),
apipj<apjpi成立。
输入描述:
第一行一个整数
n(1≤n≤100) 表示序列长度。
接下来一行n个整数
{a1,a2,a3,...,an}(1≤ai≤100) 表示序列。
输出描述:
输出一行表示满足条件的子序列的数目。因为答案可能很大,请输出答案 mod 1e9+7。
示例1
输入
2
1 2
输出
3
说明
满足条件的子序列为
{1},{2},{1,2}。
分析:
如果满足
axy<ayx,ayz<azy ,那么
axz<azx 也成立。
因为:
axz=(yaxy
)z<(yayx
)z=(yayz
)x<(yazy
)x=azx 。
以上证得传递性。对判断条件
i<j ,
aij<aji ,数太大,可以取对数把指数拿下来变成
jlogai<ilogaj 也成立。
dpi 表示以
ai 结尾的符合条件的子序列的个数,结果就是
∑dpi
Code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
const int N = 100 + 5;
int n;
int a[N];
ll dp[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
dp[i] = 1;
}
ll ans = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j < i; j++)
{
if (j * log(a[i]) > i * log(a[j]))
{
dp[i] = (dp[i] + dp[j]) % mod;
}
}
ans = (ans + dp[i]) % mod;
}
cout << ans << endl;
return 0;
}