南邮 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]);
}