首页 > ACM题库 > HDU-杭电 > HDU 4500-小Q系列故事――�潘康哪嫦�-动态规划-[解题报告]HOJ
2015
07-17

HDU 4500-小Q系列故事――�潘康哪嫦�-动态规划-[解题报告]HOJ

小Q系列故事――�潘康哪嫦�

问题描述 :

  毕业于普通本科的小Q一直自称是资深�潘浚�不仅学校不知名,甚至他自己在这个普通学校也是默默无闻――直到临近毕业的时候,班里5朵金花中的2位甚至从没和他说过话!
  谁又能想到,如此不起眼的小Q在历经重重面试环节后,竟然如愿以偿加入了心仪已久的腾讯公司!消息刚刚传开的那几天,这在他们班甚至整个学院都是讨论的热门话题,如果这时候你还表示不知道小Q是谁,你都会被大家当作怪物的。
  正所谓野百合也有春天,�潘恳灿心嫦�的那一天!
  
  刚到腾讯大厦上班的那几天,小Q眼中的一切都是那么新鲜,连每天见到的前台MM在他眼中都胖的那么可爱。小Q就这样在紧张与兴奋的情绪中度过了一天又一天,每天即勤奋认真又小心翼翼,很希望能给主管留下个好印象,以免失去这来之不易的工作机会。
  一段时间以后,随着对工作环境以及同事的熟悉,小Q逐渐放松下来,在工作间隙,他细细观察了自己的工作环境,发现整个工作室是一个N行M列的矩形布局,或者是因为�潘康谋拘灾鸩奖┞叮�他还暗自给每个同事在心里进行了魅力值评分(为区别男女,男生一律用负整数表示,女生一律用正整数表示)。
  现在,小Q把所有人的数据记录下来,并且这样定义一个位置的价值:
  1、一个位置的价值只和其上下左右四个邻居的魅力值有关(对于靠边的位置,只考虑其存在的邻居);
  2、如果某位置的邻居和该位置主人性别不同,则总分加上邻居魅力值的绝对值,否则减去;
  3、对周围所有邻居的数据处理后,最终的得分即为这个位置的最终得分,得分越高,则该位置越好;

  现在你能帮助小Q计算一下哪里才是最佳位置吗?

输入:

输入包含多组测试数据;
每组测试数据的第一行包含2个整数N和M,表示工作室的布局是N行M列;
接下来的N行,每行有M个整数,分别表示对应位置员工的魅力值数据Ki,正整数表示女生的魅力值,负整数表示男生的魅力值;
N和M为0的时候表示输入数据结束。

[Technical Specification]
N<=20
M<=20
-100<=Ki<=100

输出:

输入包含多组测试数据;
每组测试数据的第一行包含2个整数N和M,表示工作室的布局是N行M列;
接下来的N行,每行有M个整数,分别表示对应位置员工的魅力值数据Ki,正整数表示女生的魅力值,负整数表示男生的魅力值;
N和M为0的时候表示输入数据结束。

[Technical Specification]
N<=20
M<=20
-100<=Ki<=100

样例输入:

2 3
5 -4 3
-6 3 7
0 0

样例输出:

1 2 11

CE了一次。。。

在计算上下左右的魅力值时,考虑边界。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int n,m;
int a[30][30];

int Count(int i,int j)
{
	int sum = 0;
	//上
	if(i>0)
	{
		if(a[i][j]*a[i-1][j]<0)
			sum+=abs(a[i-1][j]);
		else
			sum-=abs(a[i-1][j]);
	}
    //左
	if(j>0)
	{
		if(a[i][j]*a[i][j-1]<0)
			sum+=abs(a[i][j-1]);
		else
			sum-=abs(a[i][j-1]);
	}
    //右
	if(i<n-1)
	{
		if(a[i][j]*a[i+1][j]<0)
			sum+=abs(a[i+1][j]);
		else
			sum-=abs(a[i+1][j]);
	}
    //下
	if(j<m-1)
	{
		if(a[i][j]*a[i][j+1]<0)
			sum+=abs(a[i][j+1]);
        else
            sum-=abs(a[i][j+1]);
	}
	return sum;
}

void run()
{
	int i,j,r,c;
	int Max, tmp;
	for(i=0; i<n; i++)
	{
		for(j=0; j<m; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	Max = -99999;
	for(i=0; i<n; i++)
	{
		for(j=0; j<m; j++)
		{

			tmp = Count(i,j);
			if(tmp > Max)
			{
				Max = tmp;
				r = i+1;
				c = j+1;
			}
		}
	}
	printf("%d %d %d\n", r, c, Max);
}
int main()
{
	while(scanf("%d%d", &n, &m)!=EOF)
	{
		if(n==0 && m==0) break;
		run();
	}
	return 0;
}

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

参考:http://blog.csdn.net/chuck_0430/article/details/8726554