【每日一题】子序列
子序列
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; }