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

博客介绍了如何高效地计算一个序列中互不相同的三元组(i, j, 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])
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值