南邮 OJ 1237 收集样本问题

收集样本问题

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

比赛描述

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

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

给定方形区域F中的样本分布,编程计算Rob2条行走路径,使其取得的样本总价值最大。



输入

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

输出

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

样例输入

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[N][N][2*N];
int map[N][N];
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[n][n][2*n]);
}






你可能感兴趣的:(ACM,南邮OJ,收集样本问题)