【每日一题】子序列

子序列

http://www.nowcoder.com/questionTerminal/09cfa651276641449aa25c8a5ff16bc4

题意:

求符合题目要求的子序列的个数

思路:

首先若把那个条件变成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;
}

全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务