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;
}
原文地址:https://www.cnblogs.com/zibuyu/p/2786383.html