ABC D - Distinct Trio(k元组的个数

D - Distinct Trio
题意:
给的一个序列,求出 1 ≤ i < j < k ≤ n , A i , A j , A k 1\leq i<j<k \leq n,A_i,A_j,A_k 1i<j<knAi,Aj,Ak 互不相同的元组 ( i , j , k ) (i,j,k) (i,j,k) 的个数
思路:
不妨设 A i ≤ A j ≤ A k A_i \leq A_j \leq A_k AiAjAk
枚举 A j A_j Aj,维护一个前缀和即可求得答案

经典 d p dp dp
拓展: K K K 元组
code:

n = int(input())
a = [int(x) for x in input().split()]
maxn = int(2e5 + 1)
cnt = [0 for x in range(maxn)]
vis = [0 for x in range(maxn)]
for x in a :
    cnt[x] += 1
    vis[x] = 1
for i in range(1, maxn) :
     cnt[i] += cnt[i-1]
ans = 0
for i in range(maxn) :
    if vis[i] == 0 :
        continue
    ans += (n - cnt[i]) * (cnt[i] - cnt[i-1]) * cnt[i-1]
print(ans)

d p dp dp 解法
code:

maxn = int(2e5 + 9)
n = int(input())
a = [int(x) for x in input().split()]
#给所有x-1存到列表a
dp = [[0 for i in range(5)] for j in range(maxn)]
#n*5的数组
cnt = [0 for i in range(maxn)]
for x in a :
    cnt[x] += 1
dp[0][0] = 1
#dp[i][j]表示选了j个数,每个数都<=i,且这i个数互不相同的方法数
#dp[2e5][3]就是答案
for i in range(1, maxn) :
    for j in range(5) :
        if i + 1 < maxn :
            dp[i][j] += dp[i - 1][j]#不选i
        if i + 1 < maxn and j + 1 < 5 :
            dp[i][j] += dp[i - 1][j - 1] * cnt[i]#选i
print(dp[maxn-9][3])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值