您的位置:首页 > 其它

南邮 OJ 1237 收集样本问题

2015-08-05 13:56 246 查看


收集样本问题

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 41            测试通过 : 15 

比赛描述

机器人Rob在一个有n*n个方格的方形区域F 中收集样本。(i,j)方格中样本的价值为v(i,j),如下图所示。



Rob从方形区域F的左上角A点出发,向下或向右行走,直到右下角的B点,在走过的路上,收集方格中的样本。Rob从A点到B 点共走2次,试找出Rob的2条行走路径,使其取得的样本总价值最大。
给定方形区域F中的样本分布,编程计算Rob的2条行走路径,使其取得的样本总价值最大。

输入

输入第1行有1个正整数n,表示方形区域F有n*n个方格。接下来每行有3个整数,前2个表示方格位置,第3个数为该位置样本价值。最后一行是3个0。

输出

输出计算的最大样本总价值。

样例输入

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

提示

undefined

题目来源

算法设计与实验题解

//dp[x1][x2][sum]:两条路径同步走,分别走到map[x1][sum-x1]和map[x2][sum-x2],此时的最大样本总价值
#include<stdio.h>
#define N 51
int dp

[2*N];
int map

;
int main(){
int n,x1,x2,y1,y2,sum,max,temp;
scanf("%d",&n);
while(scanf("%d%d%d",&x1,&y1,&max)==3 && (x1||y1||max)){
map[x1][y1] = max;
}
dp[1][1][2]=map[1][1];
for(sum=3; sum<=2*n; sum++){
for(x1=1; x1<=n; x1++){
y1 = sum - x1;
if(y1<1 || y1>n){
continue;
}
for(x2=1;x2<=n;x2++){
y2 = sum - x2;
if(y2<1 || y2>n){
continue;
}
max = 0;
if(x1-1>0 && x2-1>0){
if( (temp=dp[x1-1][x2-1][sum-1]) > max){
max = temp;
}
}
if(x1-1>0 && y2-1>0){
if( (temp=dp[x1-1][x2][sum-1]) > max){
max = temp;
}
}
if(y1-1>0 && x2-1>0){
if( (temp=dp[x1][x2-1][sum-1]) > max){
max = temp;
}
}
if(y1-1>0 && y2-1>0){
if( (temp = dp[x1][x2][sum-1]) >max ){
max = temp;
}
}
if(x1==x2){
dp[x1][x2][sum] = map[x1][y1] + max;
}else{
dp[x1][x2][sum] = map[x1][y1] + map[x2][y2] + max;
}
}
}
}
printf("%d\n",dp

[2*n]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息