网站开发报价和开发周期,网站建设手机端页面模板,手机上怎样制作网站,wordpress安装提示500方格取数方格取数方格取数
Description
设有N*N的方格图(N10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示#xff08;见样例#xff09;#xff1a; 某人从图的左上角的A 点出发#xff0c;可以向下行走#xff0c;也可以向右走#…方格取数方格取数方格取数
Description
设有N*N的方格图(N10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示见样例 某人从图的左上角的A 点出发可以向下行走也可以向右走直到到达右下角的B点。在走过的路上他可以取走方格中的数取走后的方格中将变为数字0。
此人从A点到B 点共走两次试找出2条这样的路径使得取得的数之和为最大。
Input
输入的第一行为一个整数N表示N*N的方格图接下来的每行有三个整数前两个表示位置第三个数为该位置上所放的数。一行单独的0表示输入结束。
Output
只需输出一个整数表示2条路径上取得的最大的和。
Sample Input
8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0
Sample Output
67
题目大意
有两个士兵从11走到nn路上有许多money但他们只能往下或往右走他们最多能得到多少money
解题方法
用四位数组表示两个士兵的位置详情请见动态转移方程
动态转移方程
f[i][j][i1][j1]max{la[i][j](ii1)and(jj1)la[i][j]a[i1][j1]elsef[i][j][i1][j1]max\left\{\begin{matrix}la[i][j]amp;(ii1)and(jj1)\\ la[i][j]a[i1][j1]amp;else\end{matrix}\right.f[i][j][i1][j1]max{la[i][j]la[i][j]a[i1][j1](ii1)and(jj1)else
标注
ij分别为第一个士兵的行列i1j1分别为第二个士兵的行列l为上一步最大的第一行是因为重复了金币只能拿一份第二行是两个士兵那两份
#includecstdio
#includeiostream
using namespace std;
int n,x,y,d,a[12][12],f[12][12][12][12];
int main()
{scanf(%d%d%d%d,n,x,y,d);while (!((x0)(y0)(d0)))//判断结束为{a[x][y]d;//放进图中scanf(%d%d%d,x,y,d);}for (int i1;in;i)//士兵一的行for (int j1;jn;j)//士兵一的列for (int i11;i1n;i1)//士兵二的行for (int j11;j1n;j1)//士兵二的列{xmax(f[i-1][j][i1-1][j1],f[i][j-1][i1][j1-1]);//分别为上上左左(这要倒着)ymax(f[i-1][j][i1][j1-1],f[i][j-1][i1-1][j1]);//分别为上左左上if ((ii1)(jj1)) f[i][j][i1][j1]max(x,y)a[i][j];//重复先把xy合并再加当前格子的金币else f[i][j][i1][j1]max(x,y)a[i][j]a[i1][j1];//要加两遍}printf(%d,f[n][n][n][n]);//输出两位士兵都到nn时的结果
}提示
本体的相似题传纸条ssl 1589因太相似就不写了