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
原创粉丝点击