在这里,我可以像这样声明一个二维数组
int dp[105][140000]
或者像这样
int dp[140000][105]
当我使用这个数组时,我发现第一个和第二个之间存在显着的时间差异。第一个比第二个更快。这是为什么? 例如我正在运行的代码
for(int i=1;i<=n;++i)
for(int k=1;k<60;++k)
{
int x = (~fact[k]) & ((1<<17)-1);
for(int s=x;s;s=(s-1)&x)
{
if(dp[i-1][s]+abs(A[i]-k) < dp[i][s|fact[k]])
{
dp[i][s | fact[k]] = dp[i-1][s] + abs(A[i]-k);
dpchoosen[i][s|fact[k]] = k;
dptracer[i][s|fact[k]] = s;
}
}
}
答案 0 :(得分:2)
我认为差异与第二个相关,有更多的计算来确定行的偏移量。 我的假设是基于行的地址计算比行内元素的地址计算更复杂。 在任何情况下,您都应该看到编译器生成的汇编代码。