时事热点
英伟达
全球市值最高的芯片公司英伟达,将于下周三(5月21日)美股盘后发布2026财年第一季度财报。自今年3月低点以来,英伟达股价已悄然上涨36%,跑赢同期标普500指数(上涨17%)一倍有余。
一时间,持有英伟达股票的投资者开心坏了。甚至有股民在投资社区调侃:自己躲过了2024年的两次回调,总算熬成了“长期主义信徒”。
看到这里,可能有读者有疑问,有这么夸张吗,还得躲过两次回调?有的,因为英伟达这一轮上涨,背后是一道漫长的“算法题”——市场一直在等两个关键变量的输出:Blackwell架构的交付节奏和中国市场的合规方案。
2025年,英伟达针对中国市场的定制芯片H20一度被传暂停接单,随后又恢复。这像极了我们在算法题中常见的“动态规划”——每一步决策都依赖上一轮的状态,而状态转移方程里藏着监管、需求和竞争对手(AMD、华为昇腾)三个变量。
而在财报发布前夕,市场上已经出现了两种截然不同的“题解”:
| “无脑AC党” | ||
| “复杂度分析党” |
两种声音在社区激烈交锋,而真正的答案,要等到下周三盘后才会“评测”出结果。
监管的“用例检查”:为什么不能放任英伟达通吃?
如果说英伟达是一家靠“标准答案”通吃的公司,那监管就是那个坚持要你写单元测试的代码审查员。
当前,英伟达在全球AI训练芯片市场的份额估计在80%-90%,在推理芯片市场也超过70%。这种集中度,在互联网并购案中其实不乏先例。最具参照意义的有两个:
案例一:腾讯收购中国音乐集团(2016年)
收购完成后,腾讯获得独家版权优势,竞争对手成本飙升,市场活力下降。最终在2021年,监管责令腾讯解除独家版权,恢复竞争。
对应到芯片行业:如果英伟达通过CUDA生态和供应链优势“锁住”客户,禁止他们采购AMD或华为的芯片——那就是硬件的“独家版权协议”。
案例二:斗鱼虎牙合并案(2021年被禁止)
合并后实体合计份额超70%,削弱下游议价权和消费者福利,市场监管总局依法禁止此项集中。
对应到芯片行业:如果云厂商(阿里、腾讯、字节)只能从英伟达一家采购,那下游的AI创业公司就要承担更高的算力成本——最终每个用ChatGPT类产品的普通人,都在为“强者通吃”买单。
好消息是,目前监管已经对英伟达提出了明确的“五项约束”(通过出口管制规则和反垄断审查机制间接实施):
不得随意提高对华供应芯片的价格或降低服务水平
不得强制搭售其他产品或软件服务
不得阻碍客户采购竞争对手(华为、AMD、寒武纪等)的芯片
不得利用CUDA生态锁定开发者迁移
需确保合规版的供应稳定性
这些限制,和喜马拉雅收购案中监管提出的五项要求,本质上是一个算法——防止“垄断”这个Bug破坏市场生态的健康运行。
对此,你怎么看?
你买过英伟达的股票吗?你用的是哪家云厂商的GPU?你觉得下周三财报发布后,英伟达股价会“AC(运行通过)”还是会“RE”(运行错误)?
欢迎在评论区聊聊你的看法。
...
回归主题。
下面是一道关于线性DP类型的动态规划的算法题。
题目描述
平台:Acwing
题号:902. 最短编辑距离
给定两个字符串
删除–将字符串 A 中的某个字符删除。插入–在字符串 A 的某个位置插入某个字符。替换–将字符串 A 中的某个字符替换为另一个字符。
现在请你求出,将
输入格式
第一行包含整数
第二行包含一个长度为
第三行包含整数
第四行包含一个长度为
字符串中均只包含大小写字母。
输出格式
输出一个整数,表示最少操作次数。
数据范围
输入样例:
10AGTCTGACGC11AGTAAGTAGGC输出样例:
4动态规划思路
状态定义
设dp[i][j] 表示:A[1..i] 转换成 B[1..j] 所需的最少操作次数(这里字符串下标从 1 开始方便处理空串)
边界条件
dp[0][j] = jA 为空串 → 要变成 B[1..j],需 插入 j 次dp[i][0] = iB 为空串 → 要删掉 A 中全部 i 个字符
状态转移
对于 dp[i][j],考虑 最后一个字符 如何处理:
情况 1:A[i] 最终被删除
等价于:先让 A[1..i-1] 变成 B[1..j],再删掉 A[i]dp[i-1][j] + 1
情况 2:A 最后插入一个 B[j]
等价于:先让 A[1..i] 变成 B[1..j-1],再在末尾插入 B[j]dp[i][j-1] + 1
情况 3:A[i] 被替换成 B[j] 或 本来就相同
如果
A[i] == B[j]:无需替换,直接继承dp[i-1][j-1]如果
A[i] != B[j]:替换一次dp[i-1][j-1] + 1
状态转移方程
dp[i][j] = min( dp[i-1][j] + 1, // 删除 A[i] dp[i][j-1] + 1, // 插入 B[j] dp[i-1][j-1] + (A[i] != B[j]))时间复杂度 & 空间
状态数:
(n+1)*(m+1)转移:O(1)
时间复杂度:O(n × m)
空间复杂度:O(n × m)(可用滚动数组优化到 O(m),不过 n,m ≤ 1000 时直接开二维没问题)
C++ 代码
#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N = 1010;int n, m;char A[N], B[N];int dp[N][N];int main() { // 输入 cin >> n >> A + 1; // 下标从 1 开始 cin >> m >> B + 1; // 边界初始化 for (int i = 0; i <= n; i++) dp[i][0] = i; // 删除全部 for (int j = 0; j <= m; j++) dp[0][j] = j; // 插入全部 // DP 填表 for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { dp[i][j] = min(dp[i-1][j] + 1, dp[i][j-1] + 1); if (A[i] == B[j]) dp[i][j] = min(dp[i][j], dp[i-1][j-1]); else dp[i][j] = min(dp[i][j], dp[i-1][j-1] + 1); } } cout << dp[n][m] << endl; return 0;}python 代码
n = int(input())A = " " + input() # 下标从1开始,方便处理空串m = int(input())B = " " + input()# 初始化 DP 表dp = [[0] * (m + 1) for _ in range(n + 1)]# 边界条件for i in range(n + 1): dp[i][0] = i # B 为空,需要删除 i 次for j in range(m + 1): dp[0][j] = j # A 为空,需要插入 j 次# 填表for i in range(1, n + 1): for j in range(1, m + 1): # 删除、插入 dp[i][j] = min(dp[i-1][j] + 1, dp[i][j-1] + 1) # 替换(或无需操作) if A[i] == B[j]: dp[i][j] = min(dp[i][j], dp[i-1][j-1]) else: dp[i][j] = min(dp[i][j], dp[i-1][j-1] + 1)print(dp[n][m])最后
感谢观看,谢谢订阅~


