这是一个组合计数问题。直接枚举所有可能的操作序列(其数量为卡特兰数 Cn,当 n=12 时非常大)来计算总收益是不可行的。
我们可以转换思路,不按操作序列来累加收益,而是按每个可能的收益项来计算它在所有方案中出现的总次数。
一个收益项由 ai⋅bk 构成,表示元素 ai 在栈的大小为 k 时被弹出。我们只需要计算出对于每一对 (i,k),元素 ai 在栈大小为 k 时被弹出的这种情况在多少个不同的操作序列中发生。记这个次数为 N(i,k)。
最终的总收益为:
给定两个长度均为 n 的序列 A 和 B,下标从 1 到 n。A 中第 i 个元素 ai 表示物品的价值,B 中第 i 个元素 bi 表示当货架中恰有 i 个物品时取下一个物品可获得的单位收益。 初始时货架为空。你需要执行恰好 2n 次操作,每次操作必须从以下两种中选择一种:
约束:序列的长度 n 不超过 12,所有物品价值 ai 和单位收益 bi 均为正整数且不超过 10。
输入共三行。第一行包含一个整数 n,表示序列长度。第二行包含 n 个整数,依次表示物品的价值 a1,a2,…,an。第三行包含 n 个整数,依次表示单位收益 b1,b2,…,bn。
输出一个整数,表示所有合法操作序列的收益之和。
输入
1
10
10
输出
100
说明
由于 n=1,唯一的合法操作序列为:先将物品 a1(价值 10)入栈,再将其弹出。弹出时栈中恰有 x=1 个物品,因此收益为 b1×a1=10×10=100。所有合法操作序列的总收益之和即为 100。
输入
2
3 4
2 1
输出
24
说明
合法操作序列共有 2 种。
第一种:入栈 3,出栈 3(栈大小 1,收益 2×3=6),入栈 4,出栈 4(栈大小 1,收益 2×4=8),总收益为 14。
第二种:入栈 3,入栈 4,出栈 4(此时栈大小 2,收益 1×4=4),出栈 3(栈大小 1,收益 2×3=6),总收益为 10。
两种序列收益之和为 14 + 10 = 24。
输入
3
1 1 1
1 2 3
输出
22
说明
由于 a1=a2=a3=1,每次出栈收益仅由栈大小决定,为 bx。对于 n=3,所有合法操作序列恰好对应 5 种不同的进出栈顺序(用 ( 表示入栈,) 表示出栈):
((())):出栈栈大小依次为 3, 2, 1,收益 b3+b2+b1=3+2+1=6。(()()):出栈栈大小依次为 2, 2, 1,收益 2+2+1=5。(())():出栈栈大小依次为 2, 1, 1,收益 2+1+1=4。()(()):出栈栈大小依次为 1, 2, 1,收益 1+2+1=4。()()():出栈栈大小依次为 1, 1, 1,收益 1+1+1=3。
总收益之和为 6 + 5 + 4 + 4 + 3 = 22。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册