• POJ3034+DP


    题意:给定一个N*N的矩阵, 然后在这个矩阵的每个格子在任意时间会出现一个鼹鼠,这个出现
         出现鼹鼠的时间是输出信息所确定的. 现在你手里有一把锤子能够去锤这些鼹鼠. 你能
         够移动锤子,移动的两点之间的距离不能超过d,且中心在这条路径上的鼹鼠到都要受到
         打击. 每个鼹鼠出现的时间值维持一秒钟. 现在问在一次游戏中最多打到多少鼹鼠

      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
    ",ans);
    112     }
    113     return 0;
    114 }
    View Code

    下面把自己wa的也贴出来。。。

      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
    ",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("
    Now = %d
    ",i);
     91             for( int j=i+1;j<=m;j++ ){
     92                 //if( i==j ) continue;
     93                 //printf("j = %d
    ",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
    ",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
    ",ans);
    138     }
    139     return 0;
    140 }
    View Code
    keep moving...
  • 相关阅读:
    《构建之法》第四章 第十七章阅读笔记
    2016012037+小学四则运算练习软件项目报告
    阅读《构建之法》所得与初步思考
    随机产生300个四则运算题
    我与软件工程的相识,相知
    转 如何快速看懂一个大型程序 http://blog.csdn.net/jysg9/article/details/24193181
    SQL Server 存储过程(转)
    sql 视图的作用(转http://www.cup.edu.cn/nic/Programing/database/34943.htm)
    linux性能问题(CPU,内存,磁盘I/O,网络)( 转载)
    qtp测试计划
  • 原文地址:https://www.cnblogs.com/xxx0624/p/3353633.html
Copyright © 2020-2023  润新知