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