谁能解释一下我对欧拉 15 项目的动态编程方法有什么问题

Can anyone explain me what is wrong with my dynamic programming approach to project euler 15?

本文关键字:动态 项目 编程 方法 问题 什么 能解释 一下      更新时间:2023-10-16

我正在学习动态编程,并尝试使用动态规划解决欧拉项目的问题15。虽然我知道这个问题可以用二项式系数解决,但我想看看我学到了多少动态规划并因此尝试了。这是代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
using namespace std;
int main()
{
    int gridsize;
    cin>>gridsize;

    int** grid = new int*[gridsize+1];
    for ( int i = 0; i < gridsize+1; i++) {
        grid[i] = new int[gridsize+1];
    }
    //Initialize the grid distances
    for ( int i = 1; i <= gridsize ; i++) {
        grid[i][0] = 1;
        grid[0][i] = 1;
    }
    grid[0][0] = 0;
    for ( int i = 1; i <= gridsize ; i++) {
        for ( int j = 1; j <= gridsize ; j++) {
            grid[i][j] = grid[i-1][j] + grid[i][j-1];
        }
    }
    cout<<grid[gridsize][gridsize]<<endl;
    delete(grid);   
    return 0;
}

预期的答案是137846528820,而我得到的答案是407575348。

你的逻辑相当正确,问题是你遇到了整数溢出的情况。这是代码的修改版本,可以完美运行。只需将int更改为long long unsigned类型即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
using namespace std;
typedef unsigned long long ull;
int main()
{
    ull gridsize;
    cin>>gridsize;

    ull** grid = (ull**) malloc((gridsize+1)*sizeof(ull*));
    for ( int i = 0; i < gridsize+1; i++) {
        grid[i] = (ull*) malloc((gridsize +1)*sizeof(ull));
    }
    //Initialize the grid distances
    for ( int i = 1; i <= gridsize ; i++) {
        grid[i][0] = 1;
        grid[0][i] = 1;
    }
    grid[0][0] = 0;
    for ( int i = 1; i <= gridsize ; i++) {
        for ( int j = 1; j <= gridsize ; j++) {
            grid[i][j] = grid[i-1][j] + grid[i][j-1];
        }
    }
    cout<<grid[gridsize][gridsize];
    free(grid);
    return 0;
}

您似乎溢出了int数据类型。根据计算:

137 846 528 820 模数 (2^32) = 407 575 348

这里似乎是一个方便的调试(或原始开发)工具是一个电子表格:您可以按照您的算法快速构建一个来解决问题,这将向您显示每一步的结果。这应该可以让您轻松识别网格右下角的溢出(从网格[16][18]开始)。