方块取数(luogu P1004)
2020-07-21 04:10
211 查看
设有 N×N 的方格图 (N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 0。如下图所示(见样例):
某人从图的左上角的 A 点出发,可以向下行走,也可以向右走,直到到达右下角的 B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 0)。此人从 A 点到 B 点共走两次,试找出 2 条这样的路径,使得取得的数之和为最大。
注意本题的重点是有2条路径。所以如果用二维的结构去解决,其算法的夫再度会很难想到。因为本题的最大数为9,所以直接用四维的数组分别储存两条路径。一个走(i,j),一个走(k,l)。
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #define N 10 using namespace std; int a[N][N][N][N]; int s[N][N]; int main() { int n,x=1,y=1,z=1; cin>>n; while (x!=0 || y!=0 || z!=0) { cin>>x>>y>>z; s[x][y]=z; } int i,j,k,l; //a[i][j][k][l] 分别指第一条到(i,j)的路径和第二条到(k,l)的路径 for (i=1; i<=n; i++) for (j=1; j<=n; j++) for (k=1; k<=n; k++) for (l=1; l<=n; l++) { a[i][j][k][l]=max(max(a[i-1][j][k-1][l],a[i-1][j][k][l-1]),max(a[i][j-1][k-1][l],a[i][j-1][k][l-1]))+s[i][j]+s[k][l]; if (i==k && j==l) a[i][j][k][l]-=s[i][j]; } cout<<a[n][n][n][n]; }
应为第一条路径只能走(i,j-1) || (i-1,j),第二条路只能走(k,l-1) || (k-1,l)。
通过max函数找到其最大路径并递归(代码有点长)。
关于时间复杂度,可以这么想: 9^4=6561,所以以计算机的计算能力基本上时间为0。(应该是这样算吧。。。。)
相关文章推荐
- 一个MIDP俄罗斯方块游戏的设计和实现
- 矩阵表达和方块覆盖问题
- Tetris in javascript[俄罗斯方块]
- 在word中输入带方块的对号
- 一个基于Yahoo UI的Ajax俄罗斯方块游戏
- J2ME 俄罗斯方块
- J2ME实战:蓝牙联网俄罗斯方块(3)—方块生成与坐标控制模块
- javascript俄罗斯方块
- ubuntu安装flash插件后,flash时中的汉字显示为方块 解决方案
- Happy Pi Day!一起来挑战俄罗斯方块圆周率版
- 与你一起探讨游戏开发,之C#详述俄罗斯方块。
- Linux下JAVA应用程序中中文显示成方块的解决办法
- 俄罗斯方块之四——方块子类
- HTML5边玩边学(9):俄罗斯方块就是这么简单 之 数据模型篇
- [原]JS俄罗斯方块
- 一款新方块游戏
- 俄罗斯方块
- java开发学习俄罗斯方块游戏
- 俄罗斯方块练习数组
- 基于xhtml+Javascript的俄罗斯方块游戏源程序