您的位置:首页 > 其它

方块取数(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。(应该是这样算吧。。。。)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: