我对rand()%i误解了什么?

时间:2016-03-31 01:41:21

标签: c++

int main() {
const int n = 5;
int A[n][n]; // value of each cell
int V[n][n]; // total value of each cell

for (int i = 0; i < n; i++)
{
    for (int j = 0; j < n; j++)
    {
        V[i][j] = 0; // initialize total value of each cell equal to zero
        A[i][j] = rand() % 10; // set each cell's value equal to some number 0-9
        printf("%i ", A[i][j]);
    }
    printf("\n");
}

for (int i = 0; i < n; i++)
{
    for (int j = 0; j < n; j++)
    {
        if (i == 0 && j == 0)
        {
            V[i][j] = A[i][j];
        }
        else if (i == 0)
        {
            V[i][j] = V[i][j - 1] + A[i][j];
        }
        else if (j == 0)
        {
            V[i][j] = V[i - 1][j] + A[i][j];
        }
        else
        {
            if (V[i][j - 1] > V[i - 1][j])
            {
                V[i][j] = V[i][j - 1] + A[i][j];
            }
            else
            {
                V[i][j] = V[i - 1][j] + A[i][j];
            }
        }
    }
}
printf("\n");
for (int i = 0; i < n; i++)
{
    for (int j = 0; j < n; j++)
    {
        if (V[i][j] < 10) printf(" %i ", V[i][j]);
        else printf("%i ", V[i][j]);
    }
    printf("\n");
}

cin.get();

}

这会输出http://i.imgur.com/Ak3KpPr.png

我不明白为什么V [0] [2]在输出V [0] [1] + A [0] [2]或7 + 4时输出12的原因。

上下文: 有一天在车库出售,你偶然发现了一个旧学校的视频游戏。在这个视频游戏中,你的 角色必须沿着n×n网格旅行,沿途收集奖励。特别, 有一个带有非负数条目的n×n矩阵A,你的角色会收到等于的奖励 Aij如果他访问网格的单元格(i,j)。您的目标是最大化收集的奖励总和 由你的角色。 (a)[4分]。游戏的第一级规则如下。你的角色从头开始 网格的左上角 - 即单元格(1,1) - 必须行进到右下角 - 即,单元(n,n) - 按步骤顺序排列。在每一步中,您的角色都可以移动任何一个角色 向右的单元格或网格中的一个单元格;向上,向左,或对角线不是 2 允许。展示如何计算O(n 2 )时间。

1 个答案:

答案 0 :(得分:1)

你从哪里了解7+4

您的代码清楚地表明V[0][2]V[0][1] + A[2][2]。但是,在您的周期的前一次迭代V[0][1]设置为V[0][0] + A[0][1]。然而,在您的周期V[0][0]的前一次迭代设置为A[0][0]

所以,V[0][0]1。这使得V[0][1] = 1 + 7 = 8。这使得V[0][2] = 8 + 4 = 12

一切都在你实施的时候。