题意:
求符合题目要求的子序列的个数
思路:
首先若把那个条件变成ai < aj,即严格上升子序列的个数的问题,只需要用dp[j]表示以j结尾的符合条件的序列的个数,每次更新时,看所有小于j的i是否符合ai < aj,若符合就加上dp[j];回到原题,那个东西最大可能要算,不太好比较,可以两边取个对数变成:
#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
const int N = 105;
ll dp[N];//dp[i]表示以i结尾的符合条件的序列个数
double x[N];
ll a[N];
int n;
int main(){
scanf("%d",&n);
for(int i = 1;i <= n;i++){
scanf("%lld",a+i);
x[i] = log(a[i]);
}
for(int i = 1;i <= n;i++){
dp[i] = 1;
for(int j = 1;j < i;j++){
if(x[i]*j > x[j]*i){
dp[i]+=dp[j];
dp[i]%=mod;
}
}
}
ll res = 0;
for(int i = 1;i <= n;i++){
res = (res+dp[i])%mod;
}
printf("%lld\n",res);
return 0;
}

京公网安备 11010502036488号