仅通过 C++ 中数组的不同初始化方法就同一输入获得两个不同的答案

Getting two different answers on same input just by different methods of initialization of an array in C++

我正在解决一个 DP 问题,最长递增子序列,其中我用两种不同的方法初始化 dp 数组,并针对相同的输入得到不同的结果。

第一种方法,我得到错误答案的地方是:int dp[n] = {1};

第二种方法,又是一个错误答案:int dp[n]; memset(dp, 1, sizeof(dp));

最后,当我使用 "for loop" 手动初始化数组时,我得到了正确的答案。

这三种初始化方法有什么区别?

输入: 第一行(N即数组的大小),下一行:数组元素

83

86 177 115 193 135 186 92 49 21 162 27 90 59 163 163 126 140 26 172 168 168 168 167 29 182 130 62 123 67 135 67 135 129 2 22 58 69 167 167 167 167 167 193 56 193 56 11 42 29 173 173 21 119 184 119 184 134 134 134 134 137 184 137 184 137 198 124 115 170 13 126 91 180 156 73 62 170 196 81 105 125 84 127 136 105 46 129 113 57 124 95 182 145 14 167 34 164 41 = 1850 7 [6 17]

正确输出:15

我对 "memset" 和直接初始化的回答是 14。使用 for 循环初始化后得到 15。

int dp[n] = {1};

您将 第一个 元素初始化为 1,其余元素为零。

memset(dp, 1, sizeof(dp));

你将所有字节设置为1,这意味着数组中的每个元素将是0x01010101

将数组的所有元素设置为特定值的"correct"方法是使用algorithm function std::fill or std::fill_n。或者使用 std::vector,您可以在其中将默认值传递给每个元素的构造函数。