南邮 OJ 1573 雷曼兔

雷曼兔

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

比赛描述

这次,鼎山成为了雷曼兔那无尽的冒险传说的新舞台!传说鼎山中埋藏着巨大的宝藏,伴随着这个传说的是一个迷题:最瑰丽的舞者将达至精灵世界的彼岸„„ 经过仔细推敲,雷曼兔发现这是一个提示宝藏埋藏位置的谜语,在该谜语中指出了一个特定的路径,只有经过了该路径宝藏才会出现,具体情况如下:鼎山的地势图可以看作一个N*N的数字矩阵,由1-N^2的数字组成(每个数字出现且仅出现一次),这些数字表示每个地点的地势高低。雷曼兔的出发点在最高的山顶处,并且每次雷曼兔可以从其当前所在的位置跳跃到任何一个比当前地点高度低的位置,假设雷曼兔该次跳跃从坐标(x1,y1) 跳到了坐标(x2,y2) ,则这次跳跃的华丽度定义为v=(|x1-x2|+|y1-y2|)^2。而开启宝藏秘密的路径就是从山顶不断跳跃直到山底(高度最低点)的华丽度总和最高的路径,而现在我们想要知道的是这个最高的华丽度总和是多少。



输入

第一行包括一个整数n(n<=50) 表示地图的长宽。 接下来n行每行包括n个数表示每个地点的高度。

输出

输出包括一个整数ans,表示从山顶到山底最高华丽度总和。

样例输入

2
3 2
1 4

样例输出

9

提示

最优路径为 4->3->2->1,得分为 4+1+4=9。

题目来源

NUPT ACM




#include<iostream>
#define N 51

int x[N*N];
int y[N*N];
int dp[N*N];

int sqr(int i){
	return i*i;
}

int main(){
	int n,i,j,k,p,maxV,temp;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
			scanf("%d",&k);
			x[k] = i;
			y[k] = j;
		}
	}
	dp[1] = 0;
	n *= n;
	for(k=2;k<=n;k++){
		maxV = 0;
		for(p=1;p<k;p++){
			if(maxV < (temp=dp[p]+sqr(abs(x[k]-x[p])+abs(y[k]-y[p])))){
				maxV = temp;
			}
		}
		dp[k] = maxV;
	}
	printf("%d\n",dp[n]);
}



你可能感兴趣的:(ACM,南邮OJ,雷曼兔)