链接:https://www.nowcoder.com/acm/contest/152/A
来源:牛客网
题目描述
小美有一个由n个元素组成的序列{a
1,a
2,a
3,...,a
n},她想知道其中有多少个子序列{a
p1,a
p2,...,a
pm}(1 ≤ m ≤ n, 1 ≤ p
1 < p
2 ,..., < p
m ≤ n),满足对于所有的i,j(1 ≤ i < j ≤ m), a
pi
pj < a
pj
pi成立。
输入描述:
第一行一个整数n (1≤n≤100)表示序列长度。 接下来一行n个整数{a1,a2,a3,...,an}(1≤ai≤100)表示序列。
输出描述:
输出一行表示满足条件的子序列的数目。因为答案可能很大,请输出答案mod 1,000,000,007。
链接:https://www.nowcoder.com/acm/contest/152/A
来源:牛客网
题解:设dp[i]表示以第i个数结尾的满足条件的子序列的个数,然后全加在一起就是答案。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long
#define mod 1000000007
int n,a[105],flag[105][105];
ll dp[105],ans;
int main(void)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
flag[i][i]=1;
for(int j=i+1;j<=n;j++)
if(j*log(a[i])<i*log(a[j]))
flag[i][j]=1;
}
for(int i=1;i<=n;i++)
dp[i]=1;
for(int i=1;i<=n;i++)
for(int j=i-1;j>0;j--)
if(flag[j][i])
dp[i]=(dp[i]+dp[j])%mod;
for(int i=1;i<=n;i++)
ans=(ans+dp[i])%mod;
printf("%lld\n",ans);
return 0;
}