题意

给定一个由n个元素组成的序列 { a1, a2, a3,..., an } ,她想知道其中有多少个子序列 { ap1, ap2, ..., apm } ,满足对于所有的 , apipj < apjpi成立。

Solution1

py + dp直接冲。

n, mod = int(input()), int(1000000007)
a = list(map(int, input().split()))
dp = [ 1 for i in range(n) ]
for i in range(0, n):
    for j in range(i):
        if (a[j] ** (i + 1) < a[i] ** (j + 1)):
            dp[i] += dp[j]
print(sum(dp) % mod)

solution2

变形公式。,即原题等价于求上升子序列的数量。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
ll res, dp[105], a[105];
int main() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    dp[i] = 1;
  }
  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;
    res = (res + dp[i]) % mod;
  }
  cout << res << '\n';
  return 0;
}