hdu 1428 漫步校园
2016-05-05 21:32
423 查看
无语了,,对这道题,从年前就做了这道题,到现在才A,之前一直以为题意是直走两个方向,即向下或向右,结果无限wa,后来看了hdu的discuss,才知道原来是可以走四个方向,自己想了一种方法,即用优先队列把图中每个点到(n,n)的距离全算出来,然后在算的同时并标明有几种距离相同的情况(一直朝四个方向搜并将队列里最小的值放在队列前面,直到搜到以前搜到过的点结束,结束时统计队列里同样搜到以前搜过的点并与最小值相同的有几个),结果TLE,自己想了想也是,如果来一个数据,只有(n,n)特别大,其他的都特别小,肯定要搜特别久。
只能问万能的度娘,看了别人的代码才发现原来这道题可以搜索+dp来解决,好厉害,Orz,,即在搜全部的点到(n,n)的距离,可以从(n,n)搜,位于队列头部的结构体一直加上之前加过的距离,并且不停地搜四个方向,这样一遍过去刚好把图遍历了一遍。速度比我的不知要多少倍,,唉~~ 然后再深搜,图中每一个点加上周围比自己小的数量。(难道这就是传说中的记忆化搜索?)
漫步校园
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3872 Accepted Submission(s): 1183
Problem Description
LL最近沉迷于AC不能自拔,每天寝室、机房两点一线。由于长时间坐在电脑边,缺乏运动。他决定充分利用每次从寝室到机房的时间,在校园里散散步。整个HDU校园呈方形布局,可划分为n*n个小方格,代表各个区域。例如LL居住的18号宿舍位于校园的西北角,即方格(1,1)代表的地方,而机房所在的第三实验楼处于东南端的(n,n)。因有多条路线可以选择,LL希望每次的散步路线都不一样。另外,他考虑从A区域到B区域仅当存在一条从B到机房的路线比任何一条从A到机房的路线更近(否则可能永远都到不了机房了…)。现在他想知道的是,所有满足要求的路线一共有多少条。你能告诉他吗?
Input
每组测试数据的第一行为n(2=
只能问万能的度娘,看了别人的代码才发现原来这道题可以搜索+dp来解决,好厉害,Orz,,即在搜全部的点到(n,n)的距离,可以从(n,n)搜,位于队列头部的结构体一直加上之前加过的距离,并且不停地搜四个方向,这样一遍过去刚好把图遍历了一遍。速度比我的不知要多少倍,,唉~~ 然后再深搜,图中每一个点加上周围比自己小的数量。(难道这就是传说中的记忆化搜索?)
漫步校园
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3872 Accepted Submission(s): 1183
Problem Description
LL最近沉迷于AC不能自拔,每天寝室、机房两点一线。由于长时间坐在电脑边,缺乏运动。他决定充分利用每次从寝室到机房的时间,在校园里散散步。整个HDU校园呈方形布局,可划分为n*n个小方格,代表各个区域。例如LL居住的18号宿舍位于校园的西北角,即方格(1,1)代表的地方,而机房所在的第三实验楼处于东南端的(n,n)。因有多条路线可以选择,LL希望每次的散步路线都不一样。另外,他考虑从A区域到B区域仅当存在一条从B到机房的路线比任何一条从A到机房的路线更近(否则可能永远都到不了机房了…)。现在他想知道的是,所有满足要求的路线一共有多少条。你能告诉他吗?
Input
每组测试数据的第一行为n(2=
#include<stdio.h> #include<string.h> #include<queue> using namespace std; const int nn=60; long long dp[nn][nn],a[nn][nn],n,f[nn][nn],fx[4][2]= {0,1,0,-1,1,0,-1,0}; struct stu { long long x,y,dis; friend bool operator <(stu aa,stu bb) { return aa.dis>bb.dis; } } s; void bfs() { stu t; s.x=n,s.y=n,s.dis=a ; f[s.x][s.y]=1; priority_queue<stu>q; q.push(s); long long i; while(!q.empty()) { s=q.top(); q.pop(); for(i=0; i<4; i++) { t.x=s.x+fx[i][0],t.y=s.y+fx[i][1]; if(t.x>0&&t.x<=n&&t.y>0&&t.y<=n&&!f[t.x][t.y]) { f[t.x][t.y]=1; a[t.x][t.y]+=s.dis; t.dis=a[t.x][t.y]; q.push(t); } } } } long long dfs(long long x,long long y) { long long i,xx,yy; if(dp[x][y]) return dp[x][y]; for(i=0; i<4; i++) { xx=x+fx[i][0],yy=y+fx[i][1]; if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&a[x][y]>a[xx][yy]) dp[x][y]+=dfs(xx,yy); } return dp[x][y]; } int main() { while(scanf("%I64d",&n)!=EOF) { memset(f,0,sizeof(f)); memset(dp,0,sizeof(dp)); long long i,j; for(i=1; i<=n; i++) for(j=1; j<=n; j++) scanf("%I64d",&a[i][j]); bfs(); dp =1; printf("%I64d\n",dfs(1,1)); } }
相关文章推荐
- PAT:用队列模拟银行排队
- Hibernate中Transaction事务的批量提交
- Android Bluetooth(蓝牙)实例
- 程序2 输出任意大小的菱形
- 程序员必读经典书籍
- Android Q&A | setOnItemClickListener(AdapterView.OnItemClickListener) in the type AdapterView....
- ActionServlet填充form的过程
- 【C++】VS2010生成的程序在安装了vc2010运行库的机器上提示“丢失MSVCR100D.dll”
- Redis配置
- Redis配置
- 易协流程管理软件(V5.0)免费版发布
- 按照层次遍历二叉树
- 性能测试总结(一)---基础理论篇
- "https://open.gl/"教程之Drawing Polygons源码(freeglut版)
- ifream爱恨情缘
- 【LeetCode-334】Increasing Triplet Subsequence
- linux进程间通信之信号量(semaphore)
- 扣丁音乐(二)——PagerSlidingTabStrp集成与运用
- Hbuilder适配问题
- 【软件测试】JUnit和Eclemma使用的例子