Description
问题描述:
机器人Rob在一个有n*n 个方格的方形区域F 中收集样本。(i,j)方格中样本的价值为v(i,j),如下图所示。
Rob 从方形区域F 的左上角A点出发,向下或向右行走,直到右下角的B 点,在走过的路上,收集方格中的样本。Rob 从A点到B 点共走2次,试找出Rob 的2条行走路径,使其取得的样本总价值最大。
编程任务:
给定方形区域F 中的样本分布,编程计算Rob 的2条行走路径,使其取得的样本总价值最大。
Input
输入数据:
第1 行有1 个正整数n,表示方形区域F有n*n 个方格。接下来每行有3 个整数,前2 个表示方格位置,第3个数为该位置样本价值。最后一行是3个0。
Output
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
KEY:我开始以为是搜索题,看了好久,感觉不好搜……后来发现居然是DP;
Source:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#include
<
iostream
>
using
namespace
std;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
a[
101
][
101
];
int
h[
101
][
101
][
101
][
101
];
int
n;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
max(
int
a,
int
b)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if(a>b) return a;
else return b;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
fun(
int
x1,
int
y1,
int
x2,
int
y2,
int
t)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if(x1==x2&&y1==y2)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
h[x1][y1][x2][y2]=max(h[x1][y1][x2][y2],t+a[x1][y1]);
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
h[x1][y1][x2][y2]=max(h[x1][y1][x2][y2],t+a[x1][y1]+a[x2][y2]);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
GetList()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int x1,y1,x2,y2;
h[1][1][1][1]=a[1][1];
int s;
for(s=2;s<=2*n-1;s++)
for(x1=1;x1<=s-1;x1++)
for(x2=1;x2<=s-1;x2++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
y1=s-x1;
y2=s-x2;
int t=h[x1][y1][x2][y2];
fun(x1+1,y1,x2+1,y2,t);
fun(x1+1,y1,x2,y2+1,t);
fun(x1,y1+1,x2+1,y2,t);
fun(x1,y1+1,x2,y2+1,t);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
main()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// freopen("fjnu_1362.in","r",stdin);
cin>>n;
int x,y,v;
while(cin>>x>>y>>v&&(x||y||v))
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
a[x][y]=v;
}
GetList();
cout<<h[n][n][n][n]<<endl;
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)