poj解题报告——3034
来源:互联网 发布:千万不要去淘宝搜这些 编辑:程序博客网 时间:2024/05/16 05:28
题意:在一个n*n的矩阵中,每个(x,y)坐标有个洞,在任意时刻(从上一时刻开始到目前时刻结束),任意位置可能会探出一个鼹鼠的头,如果用锤子打中即得一分,锤子活动的范围是以d(1=<d<=5)为半径的圆中可到达的坐标点,并且是直线移动,锤子可以移动到任意位置,同一时间同一 地点不可能出现两只鼹鼠,给出 鼹鼠这一局的出现方式,求出最多可以得多少分。
题解:动态规划,最优结果由子问题的最优结果得出。注意的是:锤子可以移动到矩阵之外。在一个确定的时刻,每个点作为endpoints可得多少分,在下一时刻,每个点作为endpoints可得多少分为:dp[i][j][k]=max{dp[x~][y~][k-1]+Mole[x][y][k]}表示以(x~,y~)为起始坐标,i,j为目标坐标,在上一时刻(x~,y~)得到的最多分加上沿路可得到的分;取这些可选路线中使第k时刻以(i,j)为目标坐标得到最多分的路线放在dp[i][j][k].
代码如下
#include<stdio.h>#include<math.h>int map[40][40][20],dp[40][40][20],n,m,d;int GCD(int a,int b){ if(a==0)return b; return GCD(b%a,a);}int max(int a,int b){return a>b?a:b;}int getsum(int x1,int y1,int x2,int y2,int t){ int dx=x2-x1,dy=y2-y1,gc,sum,i; if(dy*dy+dx*dx>d*d) return 0; sum=0; if(dx==0&&dy==0)return map[x1][y1][t]; if(abs(dx)>abs(dy)) gc=GCD(abs(dy),abs(dx)); else gc=GCD(abs(dx),abs(dy)); dx=dx/gc;dy=dy/gc; for(i=0;i<=gc;i++) sum+=map[x1+i*dx][y1+i*dy][t]; return sum;}void main(){int i,j,ans,mt;int x,y,t,sx,tx,sy,ty; while(scanf("%d%d%d",&n,&d,&m)!=EOF&&(n||d||m)) { memset(map,0,sizeof(map)); memset(dp,0,sizeof(dp));mt=1; for(i=1;i<=m;i++) { x,y,t; scanf("%d%d%d",&x,&y,&t); map[x+d][y+d][t]++; mt=max(mt,t); } n=n+2*d;ans=0; for(t=1;t<=mt;t++) { for(x=0;x<n;x++) { for(y=0;y<n;y++) { sx=(x-d)>0?x-d:0; tx=(x+d)<n?x+d:n-1; sy=(y-d)>0?y-d:0; ty=(y+d)<0?y+d:n-1; for(i=sx;i<=tx;i++) { for(j=sy;j<=ty;j++) { if(((i-x)*(i-x)+(j-y)*(j-y))-d*d>0) continue; dp[x][y][t]=max(dp[x][y][t],getsum(i,j,x,y,t)+dp[i][j][t-1]); } }if(t==mt)ans=max(ans,dp[x][y][t]); } } } printf("%d\n",ans); }}
0 0
- poj解题报告——3034
- POJ 1088 滑雪——解题报告
- POJ 1047——解题报告
- poj解题报告——poj1006
- poj解题报告——1032
- poj解题报告——1061
- poj解题报告——1450
- poj解题报告——1002
- poj解题报告——2109
- poj解题报告——1218
- poj解题报告——1250
- poj解题报告——1012
- poj解题报告——3299
- poj解题报告——2209
- poj解题报告——2406
- poj解题报告——2242
- poj解题报告——1401
- poj解题报告——1328
- Reorder List
- 用python进行DNS查询--(报文解析篇)
- file标签之轻松浏览目录
- D3D9 光照和材质
- 怎样编写高质量的Java代码
- poj解题报告——3034
- 线段树基础 poj2352
- ARC 和MRC
- 脱壳经历以及一些疑问
- Android Studio VS Eclipse (还在用Eclipse?你OUT了!)
- 普及太阳能将引发划时代工业革命
- pat1081 Rational Sum
- window环境下解决gvim文字乱码问题
- 转:android:ellipsize实现跑马灯效果总结