您的位置:首页 > 其它

POJ 3034 Whac-a-Mole(DP)

2013-07-13 20:41 453 查看
题目链接

理解了题意之后,这个题感觉状态转移还是挺好想的,实现起来确实有点繁琐,代码能力还有待加强,经过很长时间才发现bug。注意坐标可能是负的。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int dp[12][40][41];
bool o[12][41][41];
int n,ans,d;
int gcd(int a,int b)
{
return b == 0?a:gcd(b,a%b);
}
int fun(int t,int x,int y,int tx,int ty,int ax,int ay)
{
int temp = 0;
while(x != ax||y != ay)//开始这里写成&&
{
if(o[t+1][x][y])
temp ++;
x += tx;
y += ty;
}
return temp+o[t+1][x][y];
}
void judge(int t,int x,int y)
{
int i,j,g;
for(i = x-d;i <= x+d;i ++)
{
for(j = y-d;j <= y+d;j ++)
{
if((i-x)*(i-x)+(j-y)*(j-y) > d*d) continue;
if(i < 0||j < 0) continue;
if(i > n+10||j > n+10) continue;
g = gcd(abs(i-x),abs(j-y));
if(g == 0) g = 1;
int tx,ty;
tx = (i-x)/g;
ty = (j-y)/g;
dp[t+1][i][j] = max(dp[t+1][i][j],dp[t][x][y]+fun(t,x,y,tx,ty,i,j));
ans = max(dp[t+1][i][j],ans);
}
}
}
int main()
{
int m,i,j,k,y,x,t;
while(scanf("%d%d%d",&n,&d,&m)!=EOF)
{
if(n == 0&&d == 0&&m == 0) break;
memset(dp,0,sizeof(dp));
memset(o,0,sizeof(o));
for(i = 1; i <= m; i ++)
{
scanf("%d%d%d",&x,&y,&t);
o[t][x+5][y+5] = 1;
}
ans = 0;
for(i = 0; i <= 10; i ++)
{
for(j = 0; j < n+10; j ++)
{
for(k = 0; k < n+10; k ++)
{
judge(i,j,k);
}
}
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: