算法:配对游戏(美团)

美团点评是综合性生活服务平台,覆盖吃喝玩乐。在休闲娱乐版块,有很多轰趴、桌游、密室逃脱类的项目,适合多人一起玩。下面就是出自团队游戏场景中的一个问题。

有 n 个人排成一排,一开始全部面向前方,然后大家一起转身,随机朝左或是朝右转。
转身后,不断检查队列,如果存在两个面对面的相邻的人,则将这两个人从队列中消除;直到不存在两个面对面的相邻的人。
例如 > 表示向右, < 表示向左
队列“>>><<<”的消除过程为,“>>><<<”到“>><<”到“><”到“”(每次去除一对),最后剩下人数为0。
队列“>><><<<>”的消除过程为,“>><><<<>”到“>><<<>”到“><<>”到“<>”(每次去除一对),最后剩下人数为2
求最后剩下人数的期望值。

输入描述:

一行一个正整数 n (1 ≤ n ≤ 2000)。

输出描述:

一行一个实数,表示剩下人数的期望值,四舍五入保留三位小数。

实例1:

输入

10

输出

4.168

思路:运用递推,当n=1时,那么期望f(1)=1
当n =2 时,那么期望f(2)=1.5=[(1/2*1/2)*0+3/4*2]/2

<< >>
<> ><为0

当n=3时,那么期望f(3)=2 =(12+4)/2

<<< ><<为1
<<> ><> 为1
<><为1 >><为1
<>> >>>

那么当n=4时,那么期望值f(4)=44/16=11/4

<<<< <<<> <<>< <<>>
<><< <><> <>>< <>>>
><<< ><<> ><>< ><>>
>><< >><> >>>< >>>>

观察规律:当只消掉一对<>时 留下的为 << >> <> ><

代码:

链接:https://www.nowcoder.com/questionTerminal/8a68ffd4560744da82c9040af3bead9e
来源:牛客网

f[1]=1;f[2]=1.5;f[3]=2;
for(int i=4;i<=n;i++)
    f[i]=(-(i-2)*f[i-3]+(i-3)*f[i-2]+(i+1)*f[i-1])/i;
printf("%.3lf\n",f[n]);
### 细粒度情感分析中的自注意力机制 #### 自注意力机制概述 自注意力机制是一种特殊的注意力机制,允许模型在同一序列的不同位置之间建立联系。这种机制使得模型可以聚焦于输入序列中最相关的部分,而无需考虑距离因素。在自然语言处理任务中,特别是对于细粒度情感分析而言,自注意力机制有助于捕捉文本片段内的重要信息及其相互关系[^4]。 #### 应用背景 近年来,随着NLP领域的发展,细粒度情感分析逐渐成为研究热点之一。相较于传统的文档级别或句子级别的分类方式,面向特定方面(aspect)的情感极性判断更加贴近实际应用场景需求。例如,在线评论往往涉及多个维度的产品特性描述,仅依靠整体评分难以满足精准营销和服务改进的要求。因此,深入挖掘用户反馈背后隐藏的态度倾向显得尤为重要[^2]。 #### 技术实现细节 为了有效执行对象级情感分析(Aspect-Level Sentiment Analysis),研究人员引入了Transformer架构下的自注意力层作为核心组件。下面给出了一种简化版的Python代码示例,展示了如何利用PyTorch框架构建带有自注意功能的基础模块: ```python import torch.nn as nn import math class SelfAttention(nn.Module): def __init__(self, embed_size, heads): super(SelfAttention, self).__init__() self.embed_size = embed_size self.heads = heads # 定义查询、键和值矩阵参数 self.values = nn.Linear(self.embed_size, self.embed_size, bias=False) self.keys = nn.Linear(self.embed_size, self.embed_size, bias=False) self.queries = nn.Linear(self.embed_size, self.embed_size, bias=False) # 输出投影层 self.fc_out = nn.Linear(heads * embed_size, embed_size) def forward(self, values, keys, query, mask=None): N = query.shape[0] value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1] # 将嵌入向量分割成多头并行计算 values = self.values(values).view(N, value_len, self.heads, self.embed_size // self.heads) keys = self.keys(keys).view(N, key_len, self.heads, self.embed_size // self.heads) queries = self.queries(query).view(N, query_len, self.heads, self.embed_size // self.heads) # 计算QK转置乘积除以根号d_k得到分数scores scores = torch.einsum("nqhd,nkhd->nhqk", [queries, keys]) / (self.embed_size ** 0.5) if mask is not None: scores = scores.masked_fill(mask == 0, float("-1e20")) attention = torch.softmax(scores, dim=-1) out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape( N, query_len, self.heads * (self.embed_size // self.heads) ) out = self.fc_out(out) return out ``` 此段代码定义了一个简单的`SelfAttention`类,它接收三个张量——values、keys 和 queries,并返回经过加权求和后的输出。这里采用了多头策略来增强表达能力;同时通过softmax函数实现了概率分布式的权重分配方案,确保每一对query-key配对都能获得合理的关注度得分。 #### 实际案例分享 美团点评团队在其内部项目实践中探索出了适用于本地生活服务平台特点的技术路线图。除了采用预训练BERT模型外,还特别强调了针对具体业务场景定制化开发的重要性。比如,在餐饮行业里,顾客可能会提到诸如菜品质量、服务态度等多个方面的意见,这就要求算法具备足够的灵活性去识别不同类型的评价要素,并据此作出准确的情绪解读。为此,该公司不仅优化了现有模型结构,而且积极收集整理高质量的数据资源用于迭代更新,最终形成了较为成熟的解决方案体系[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值