题意
给定一个由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; }