NYOJ_195

本是动态规划,刚开始的思路是在每个点观察最优解。但是这样似乎比较慢。没办法,参考了别人的思路。就是只考虑 提示的可通过格子即可。

思路:

 1:先将输入的数据存到一个结构体中(方便排序)

 2.将输入的数据进行排序。因为输入时可能不是从小到大的顺序输入的

 3. 用动态规划的思想,排出从起始位置到最后的可行 最短长度

 4. 长加宽 减去 缩短的距离

代码:

 

#include<stdio.h>

#include<algorithm>

#include<math.h>

using namespace std;

struct str{

	int x;

	int y;

}a[1002];





bool cmp(str c,str b)

{

	if(c.x<b.x)

		return true;

	else 

		return false;

}

int max(int b,int c)

{

	return b>c?b:c;

}

int main()

{

	int n,m,k,f[1002],maxs,i,j;

	while(scanf("%d%d%d",&n,&m,&k)!=EOF)

	{

		for(i=0;i<k;++i)

		{

			scanf("%d%d",&a[i].x,&a[i].y);

		}

		sort(a,a+k,cmp);

		maxs=0;

		f[0]=1;

		for(i=0;i<k;++i)

		{

			f[i]=1;

			for(j=0;j<i;++j)

			{

				if(a[j].x<a[i].x && a[j].y<a[i].y)

					f[i]=max(f[i],f[j]+1);

			}

			if(maxs<f[i])

				maxs = f[i];

		}

		printf("%.0lf\n",(n+m-(2-sqrt(2.0))*maxs)*100);

	}

	return 0;

}

 

你可能感兴趣的:(OJ)