谁能解释一下我对欧拉 15 项目的动态编程方法有什么问题
Can anyone explain me what is wrong with my dynamic programming approach to project euler 15?
我正在学习动态编程,并尝试使用动态规划解决欧拉项目的问题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]开始)。
相关文章:
- 静态链接 Visual Studio dll 到动态链接的 sfml 项目
- 从另一个动态链接库项目调用静态库函数
- 是否有任何 MSBuild 命令行选项可以动态禁用 c++ 项目的代码分析?
- 将动态库链接到我的项目
- 如何在 Visual Studio 2015 中将项目的配置类型动态更改为静态库?
- 如何在滚动区域中动态插入项目并在QT中加载滚动条
- CMFCToolBar 和 CMFCMenuBar 默认不显示动态项目
- 游戏项目的多对象类型容器或动态铸造
- 问题:如何使动态添加的项目在设计时不符合样式表集
- 如何将项目添加到二维动态矢量
- 使用 NetBeans 动态库项目中不同目录中的源文件
- 谁能解释一下我对欧拉 15 项目的动态编程方法有什么问题
- 如何在 C++ xcode 项目中使用动态共享库
- C++:使用宏字符串将项目转换为动态变量的简单方法
- Makefile:强制项目在构建时使用动态或静态库
- C++动态库存系统——添加/删除项目
- 鼠标按下QComboBox的插槽-如果用户单击组合框,则动态填充项目
- Netbeans/C++:将2个项目链接在一起(可执行文件/动态库)
- 具有动态项目大小的C++向量
- QComboBox动态项目列表