POJ3034+DP
题意:给定一个N*N的矩阵, 然后在这个矩阵的每个格子在任意时间会出现一个鼹鼠,这个出现
出现鼹鼠的时间是输出信息所确定的. 现在你手里有一把锤子能够去锤这些鼹鼠. 你能
够移动锤子,移动的两点之间的距离不能超过d,且中心在这条路径上的鼹鼠到都要受到
打击. 每个鼹鼠出现的时间值维持一秒钟. 现在问在一次游戏中最多打到多少鼹鼠
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 dp 3 题意:给定一个N*N的矩阵, 然后在这个矩阵的每个格子在任意时间会出现一个鼹鼠,这个出现 4 出现鼹鼠的时间是输出信息所确定的. 现在你手里有一把锤子能够去锤这些鼹鼠. 你能 5 够移动锤子,移动的两点之间的距离不能超过d,且中心在这条路径上的鼹鼠到都要受到 6 打击. 每个鼹鼠出现的时间值维持一秒钟. 现在问在一次游戏中最多打到多少鼹鼠 7 思路:一开始状态定义正确,但是思路有问题,不能处理 k-1时刻 到 k时刻 的鼹鼠(也就是没法判断这“两种”鼹鼠的距离是否小于<=d) 8 9 */ 10 #include<algorithm> 11 #include<iostream> 12 #include<string.h> 13 #include<stdlib.h> 14 #include<stdio.h> 15 #include<math.h> 16 #include<queue> 17 #include<stack> 18 #include<map> 19 #include<set> 20 using namespace std; 21 typedef long long int64; 22 //typedef __int64 int64; 23 typedef pair<int64,int64> PII; 24 #define MP(a,b) make_pair((a),(b)) 25 const int inf = 0x3f3f3f3f; 26 const double pi=acos(-1.0); 27 const int dx[]={1,-1,0,0}; 28 const int dy[]={0,0,1,-1}; 29 const double eps = 1e-8; 30 const int maxm = 1005; 31 const int maxn = 35; 32 33 int mat[ 12 ][ maxn ][ maxn ]; 34 int dp[ 12 ][ maxn ][ maxn ]; 35 //dp[t][x][y]:当t时刻,锤子打了xy的鼹鼠的MaxVal 36 int d; 37 38 int dis2( int x1,int y1,int x2,int y2 ){ 39 return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2); 40 } 41 42 int Count( int cur_ti,int x1,int y1,int x2,int y2 ){ 43 int cnt = 0; 44 if( x1==x2 ){ 45 if( y1>y2 ) swap( y1,y2 ); 46 for( int i=y1;i<=y2;i++ ){ 47 cnt += mat[ cur_ti ][ x1 ][ i ]; 48 } 49 return cnt; 50 } 51 if( y1==y2 ){ 52 if( x1>x2 ) swap( x1,x2 ); 53 for( int i=x1;i<=x2;i++ ){ 54 cnt += mat[ cur_ti ][ i ][ y1 ]; 55 } 56 return cnt; 57 } 58 if( x1>x2 ){ 59 swap( x1,x2 ); 60 swap( y1,y2 ); 61 } 62 for( int i=x1;i<=x2;i++ ){ 63 if( ((i-x1)*y2+(x2-i)*y1)%(x2-x1)==0 ){ 64 cnt += mat[ cur_ti ][ i ][ ((i-x1)*y2+(x2-i)*y1)/(x2-x1) ]; 65 } 66 } 67 return cnt; 68 } 69 70 int DP( int n,int MaxTi ){ 71 n+=10; 72 int ans = 0; 73 for( int i=2;i<=MaxTi+1;i++ ){ 74 for( int x=0;x<n;x++ ){ 75 for( int y=0;y<n;y++ ){ 76 dp[ i ][ x ][ y ] = 0; 77 int Ymax = min( y+d,n-1 ); 78 int Ymin = max( 0,y-d ); 79 int Xmax = min( x+d,n-1 ); 80 int Xmin = max( 0,x-d ); 81 for( int x2=Xmin;x2<=Xmax;x2++ ){ 82 for( int y2=Ymin;y2<=Ymax;y2++ ){ 83 if( dis2( x,y,x2,y2 )<=d*d ){ 84 dp[i][x][y] = max( dp[i][x][y],dp[i-1][x2][y2]+Count( i-1,x,y,x2,y2 ) ); 85 } 86 } 87 } 88 ans = max( ans,dp[ i ][ x ][ y ] ); 89 } 90 } 91 } 92 return ans; 93 } 94 95 int main(){ 96 int n,m; 97 while( scanf("%d%d%d",&n,&d,&m)==3 ){ 98 if( n==0&&d==0&&m==0 ) 99 break; 100 memset( mat,0,sizeof( mat ) ); 101 int MaxTi = 0; 102 for( int i=0;i<m;i++ ){ 103 int x,y,t; 104 scanf("%d%d%d",&x,&y,&t); 105 x += 5; 106 y += 5; 107 MaxTi = max( MaxTi,t ); 108 mat[ t ][ x ][ y ] = 1; 109 } 110 int ans = DP( n,MaxTi ); 111 printf("%d\n",ans); 112 } 113 return 0; 114 }
下面把自己wa的也贴出来。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 3 */ 4 #include<algorithm> 5 #include<iostream> 6 #include<string.h> 7 #include<stdlib.h> 8 #include<stdio.h> 9 #include<math.h> 10 #include<queue> 11 #include<stack> 12 #include<map> 13 #include<set> 14 using namespace std; 15 typedef long long int64; 16 //typedef __int64 int64; 17 typedef pair<int64,int64> PII; 18 #define MP(a,b) make_pair((a),(b)) 19 const int inf = 0x3f3f3f3f; 20 const double pi=acos(-1.0); 21 const int dx[]={1,-1,0,0}; 22 const int dy[]={0,0,1,-1}; 23 const double eps = 1e-8; 24 const int maxm = 1005; 25 const int maxn = 1005; 26 27 struct Node{ 28 double x,y; 29 int t; 30 }node[ maxn ]; 31 double d; 32 33 double dis( int i,int j ){ 34 return sqrt( (node[i].x-node[j].x)*(node[i].x-node[j].x)+(node[i].y-node[j].y)*(node[i].y-node[j].y) ); 35 } 36 37 struct Node2{ 38 int val; 39 int pre_mole; 40 int cur_mole; 41 }dp[ 12 ][ maxn ]; 42 //dp[i][j]:时刻i打了第j只地鼠 43 int cmp( Node a,Node b ){ 44 if( a.t!=b.t ) return a.t<b.t; 45 else if( a.x!=b.x ) return a.x<b.x; 46 else if( a.y<b.y ) return a.y<b.y; 47 } 48 49 bool OnLine3( int x,int y,int z ){ 50 double sum = (node[x].x-node[y].x)*(node[y].y-node[z].y)-(node[y].x-node[z].x)*(node[x].y-node[y].y); 51 if( sum==0 ) return true; 52 return false; 53 } 54 55 bool JudgeDis( int x,int y,int z ){ 56 double d1 = dis( x,y ); 57 double d2 = dis( x,z ); 58 double d3 = dis( y,z ); 59 if( d1>d||d2>d||d3>d ) return false; 60 return true; 61 } 62 63 int main(){ 64 int n,m; 65 //double d; 66 freopen("in.txt","r",stdin); 67 while( scanf("%d%lf%d",&n,&d,&m)==3 ){ 68 if( n==0&&d==0&&m==0 ) 69 break; 70 int M = -1; 71 for( int i=1;i<=m;i++ ){ 72 scanf("%lf%lf%d",&node[i].x,&node[i].y,&node[i].t); 73 M = max( M,node[i].t ); 74 } 75 sort( node+1,node+1+m,cmp ); 76 //for( int i=1;i<=m;i++ ) 77 // printf("%lf %lf\n",node[i].x,node[i].y); 78 for( int i=0;i<12;i++ ){ 79 for( int j=0;j<maxn;j++ ){ 80 dp[i][j].pre_mole = -1; 81 dp[i][j].cur_mole = -1; 82 dp[i][j].val = 0; 83 } 84 }//init 85 for( int i=1;i<=m;i++ ){ 86 dp[ node[i].t ][ i ].val = 1; 87 dp[ node[i].t ][ i ].cur_mole = i; 88 } 89 for( int i=1;i<=m;i++ ){ 90 //printf("\nNow = %d\n",i); 91 for( int j=i+1;j<=m;j++ ){ 92 //if( i==j ) continue; 93 //printf("j = %d\n",j); 94 if( node[j].t>node[i].t && dis( i,j )<=d ){ 95 if( dp[ node[j].t ][ j ].val<dp[ node[i].t ][ i ].val+1 ) { 96 dp[ node[j].t ][ j ].val = dp[ node[i].t ][ i ].val+1; 97 dp[ node[j].t ][ j ].cur_mole = j; 98 dp[ node[j].t ][ j ].pre_mole = i; 99 } 100 } 101 else if( node[j].t==node[i].t ){ 102 if( dp[ node[i].t ][ i ].pre_mole==-1 ){ 103 if( dis(i,j)<=d && dp[ node[i].t ][ i ].val+1>dp[ node[j].t ][ j ].val ){ 104 dp[ node[j].t ][ j ].val = dp[ node[i].t ][ i ].val+1; 105 dp[ node[j].t ][ j ].cur_mole = j; 106 dp[ node[j].t ][ j ].pre_mole = i; 107 } 108 }//2 109 else { 110 if( OnLine3( dp[ node[i].t ][ i ].pre_mole,i,j )==true ){ 111 if( JudgeDis( dp[ node[i].t ][ i ].pre_mole,i,j )==true && dp[ node[i].t ][ i ].val+1>dp[ node[j].t ][ j ].val ){ 112 dp[ node[j].t ][ j ].val = dp[ node[i].t ][ i ].val+1; 113 dp[ node[j].t ][ j ].cur_mole = j; 114 dp[ node[j].t ][ j ].pre_mole = dp[ node[i].t ][ i ].pre_mole; 115 } 116 } 117 else if( node[j].t>node[dp[ node[i].t ][ i ].pre_mole].t ){ 118 if( dis( i,j )<=d &&dp[ node[i].t ][ i ].val+1>dp[ node[j].t ][ j ].val ){ 119 dp[ node[j].t ][ j ].val = dp[ node[i].t ][ i ].val+1; 120 dp[ node[j].t ][ j ].cur_mole = j; 121 dp[ node[j].t ][ j ].pre_mole = dp[ node[i].t ][ i ].pre_mole; 122 } 123 } 124 } 125 } 126 } 127 //for( int k=1;k<=m;k++ ){ 128 //printf("num=%d, pre=%d, cur=%d\n",dp[node[k].t][k].val,dp[node[k].t][k].pre_mole,dp[node[k].t][k].cur_mole); 129 //} 130 } 131 int ans = 0; 132 for( int i=1;i<=M;i++ ){ 133 for( int j=1;j<=m;j++ ){ 134 ans = max( ans,dp[i][j].val ); 135 } 136 } 137 printf("%d\n",ans); 138 } 139 return 0; 140 }
keep moving...