腾讯2025年校招笔试真题手撕(二)

一、题目

最近以比特币为代表的数字货币市场非常动荡,聪明的小明打算用马尔科夫链来建模股市。如图所示,该模型有三种状态:"行情稳定","行情大跌"以及"行情大涨"。每一个状态都以一定的概率转化到下一个状态。比如,"行情稳定"以0.4的概率转化到"行情大跌"的状态。

有了概率转移矩阵P,我们只要知道一个初始状态 ,我们就容易可以知道第 t 步三种状态的概率了。由此可以知道行情什么时候大涨大跌,从而发家致富,赢取白富美,走向人生巅峰。比如我们想知道第1步之后"行情大跌"的概率,那么由全概率公式和马尔科夫链的性质(第t步的概率只和第t-1步有关):

可以通过该模型,计算出第t步的"行情大涨"的概率吗?如果这个概率大于0.5那么输出1,否则输出0。

输入描述 第1行输入为测试数据组数T(1<=T<1000),接下来T组每5行的数据格式为 T组第1行是步长1<=t<=10。 T组第2行是一个3维的初始状态 T组第3行到第5行是3*3的概率转移矩阵P,每行有三个浮点数

输出描述 如果第t步的"行情大涨"概率大于0.5那么输出1,否则输出0

二、分析

该问题着重于预测数字货币市场行情在未来特定时间步处于"行情大涨"状态的可能性,以此辅助决策。题目要求利用马尔科夫链这一数学工具,基于给定的初始状态和转移概率矩阵,计算第 t 步时"行情大涨"状态发生的概率是否超过 0.5。马尔科夫链的核心特性在于无记忆性,即第 t 步的状态仅依赖于第 t-1 步的状态,这使得我们能够通过逐步迭代的方式,依据转移概率矩阵预测未来的状态分布。

具体到本题,每组测试数据包括初始状态向量和转移概率矩阵。初始状态向量的三个分量分别代表"行情稳定""行情大跌"和"行情大涨"三种状态的初始概率。转移概率矩阵是一个 3×3 的矩阵,其中每个元素 P[i][j] 表示从状态 i 转移到状态 j 的概率。为了计算第 t 步的状态概率分布,我们需要从初始状态出发,连续应用 t-1 次转移概率矩阵。这可以通过矩阵乘法的方式实现:每一步,我们都用当前状态概率分布与转移概率矩阵相乘,得到下一步的状态概率分布。

在算法实现上,针对每组测试数据,首先读取步长 t、初始状态向量以及转移概率矩阵。然后,从初始状态开始,进行 t-1 次状态转移计算。在每一次转移中,我们都根据转移概率矩阵更新各状态的概率。具体来说,对于每个可能的起始状态,我们将该状态的概率分配到下一个状态,分配的比例由转移概率决定。经过 t-1 次这样的转移后,我们得到第 t 步的状态概率分布。此时,只需检查"行情大涨"状态的概率是否超过 0.5,即可决定输出 1 或 0。

三、代码

python 复制代码
def main():
    import sys
    input = sys.stdin.read().split()
    ptr = 0
    T = int(input[ptr])
    ptr += 1
    for _ in range(T):
        t = int(input[ptr])
        ptr += 1
        state = list(map(float, input[ptr:ptr+3]))
        ptr += 3
        P = []
        for i in range(3):
            row = list(map(float, input[ptr:ptr+3]))
            P.append(row)
            ptr += 3
        current_state = state.copy()
        for _ in range(t-1):
            new_state = [0.0]*3
            for j in range(3):
                for k in range(3):
                    new_state[j] += current_state[k] * P[k][j]
            current_state = new_state
        if current_state[2] > 0.5:
            print(1)
        else:
            print(0)

if __name__ == "__main__":
    main()
  1. 输入读取与解析

    • 读取输入的所有数据,并将其存储在一个列表中。

    • 使用指针 ptr 来逐个访问输入数据。

    • 第一个输入是测试数据组数 T

  2. 每组数据处理

    • 对于每组数据,首先读取步长 t

    • 接着读取初始状态向量 state,该向量包含三个元素,分别表示初始时刻处于"行情稳定"、"行情大跌"和"行情大涨"三种状态的概率。

    • 然后读取 3×3 的转移概率矩阵 P,其中每个元素 P[i][j] 表示从状态 i 转移到状态 j 的概率。

  3. 状态转移计算

    • 初始化当前状态为初始状态向量 current_state

    • 对于从第 1 步到第 t-1 步的每一步,计算下一步的状态概率分布:

      • 创建一个新的状态向量 new_state,初始化为全 0。

      • 对于每个状态 j,计算当前状态转移到状态 j 的总概率,并累加到 new_state[j] 中。

    • 将当前状态更新为新计算的状态 new_state

  4. 输出结果

    • 在完成 t-1 次转移后,检查当前状态中"行情大涨"(对应索引 2)的概率是否大于 0.5。

    • 如果大于 0.5,则输出 1;否则输出 0。

这个代码实现了对每组测试数据的输入解析、状态转移的迭代计算以及最终结果的判断和输出。

相关推荐
叶子爱分享22 分钟前
从事算法工作对算法刷题量的需求
算法
勇闯IT25 分钟前
有多少小于当前数字的数字
java·数据结构·算法
liuqun03191 小时前
开心灿烂go开发面试题
算法·leetcode·golang
liulilittle1 小时前
通过高级处理器硬件指令集AES-NI实现AES-256-CFB算法并通过OPENSSL加密验证算法正确性。
linux·服务器·c++·算法·安全·加密·openssl
小皮侠1 小时前
【算法篇】逐步理解动态规划模型6(回文串问题)
java·开发语言·算法·动态规划
IT猿手1 小时前
动态多目标进化算法:基于迁移学习的动态多目标粒子群优化算法(TrMOPSO)求解IEEE CEC 2015,提供完整MATLAB代码
算法·matlab·迁移学习·动态多目标进化优化·动态多目标算法
এ᭄画画的北北1 小时前
力扣-279.完全平方数
数据结构·算法·leetcode
实习生小黄2 小时前
双三次贝塞尔曲面-canvas 实现4x4网格图片变化功能
前端·算法
jz_ddk2 小时前
[学习] FIR多项滤波器的数学原理详解:从多相分解到高效实现(完整仿真代码)
学习·算法·matlab
IT猿手2 小时前
动态多目标进化算法:基于迁移学习的动态多目标遗传算法Tr-NSGA-II求解CEC2015,提供完整MATLAB代码
人工智能·算法·机器学习·matlab·迁移学习·动态多目标进化算法·动态多目标优化算法