大数组放在函数里会怎样
把 int dp[5000][5000] 写在 main 里面(局部变量),运行时【0】。
memset 按什么填
memset(dp, 1, sizeof dp) 之后,int 数组 dp 里的每个元素是【0】。
一亿字节是多少 MB
运行下面这段程序: #include <algorithm> #include <iostream> #include <string> #include <vector> using nam
只留两行也能算对
下面只开两行,用 i & 1 轮流当「这一行」和「上一行」。运行这段程序: 本路线的物品:(重 3 值 8)、(重 4 值 9)、(重 5 值 11),写成 vector<pair<int, int>>,au
用两行滚动写背包
补全 knap_roll:只开两行,第 i 件物品写进 dp[i & 1],从 dp[(i & 1) ^ 1] 取上一行。输出容量 10 的最大价值。 本路线的物品:(重 3 值 8)、(重 4 值 9)、(重 5 值 11
把大表挪到函数外面
求 3000 × 3000 网格的路径数(对 10^9+7 取模)。起始代码把 grid 开在 main 里面——约 36 MB 的局部数组,一运行就会因为栈放不下而段错误崩溃(故意的:让你亲眼看看)。把它挪到 main 外面,再运行。 (
memset 填对「无穷大」
用面值 2、3、7 凑出 12,求最少几枚,dp 数组先要填成「无穷大」。memset 是按字节填的,填 1000000000 只会取它的最低一个字节(0)。改成填 0x3f:每个 int 变成 0x3f3f3f3f,约 10.6 亿,足够
编辑距离也能滚
编辑距离的第 i 行只依赖第 i-1 行,所以用两个一维数组 pre、cur 就够。补全每一行算完之后的那一步,输出「horse 变 ros 的步数/intention 变 execution 的步数」。 (本题用 g++ -std=c++
方案数要用 long long
面值 1、2、5、10、20、50、100、200,凑出 10000 有几种组合?方案数远远超过 21 亿,dp 数组要选对类型。 (本题用 g++ -std=c++17 -O0 编译。)
区间 DP 的状态是什么
第 1 步:长度 1:自己一堆,代价 0 第 2 步:再填长度 2 的区间 第 3 步:再填长度 3 的区间 第 4 步:再填长度 4 的区间 第 5 步:右上角就是整段的答案 j=0 j=1 j=2 j=3 i=0 i=1 i=2 i=3