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