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

京公网安备 11010502036488号