方格取数NOIP2000

来源:百度知道 编辑:UC知道 时间:2024/05/25 05:21:08
用1次DP,给出程序和思路

问题描述:
设有N*N的方格图(N<=8),我们将其中的某些方格中填入正整数,而其他的方格中则放
人数字0。如下图所示(见样例):
A 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0
0 0 13 0 0 6 0 0
0 0 0 0 7 0 0 0
0 0 0 14 0 0 0 0
0 21 0 0 0 4 0 0
0 0 15 0 0 0 0 0
0 14 0 0 0 0 0 0
0 0 0 0 0 0 0 0

某人从图的左上角的A点出发,可以向下行走,也可以向右走,直到到达右下角的B
点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。
此人从A点到B点共走两次,试找出2条这样的路径,使得取得的数之和为最大。

输入:
输入的第一行为一个整数N(表示N*N的方格图),接下来的每行有三个整数,前两个
表示位置,第三个数为该位置上所放的数。一行单独的0表示输入结束。

输出:
只需输出一个整数,表示2条路径上取得的最大的和。

样例:
输入
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

输出
67
不明白,详细点吧

设f[x1,y1,x2,y2]表示从0,0出发两人分别到(x1,y1),(x2,y2)所能得到的最大的宝物。具体f[x1,y1,x2,y2]=max{f[x1-1,y1,x2-1,y2],f[x1-1,y1,x2,y2-1],f[x1,y1-1,x2-1,y2],f[x1,y1-1,x2,y2-1]}+这一次所采得宝物。如果这一次x1=x2,y1=y2,那么还要特殊处理一下,就是避免重复计算。