• HDU 3406 Baseball of Planet Pandora


    Baseball of Planet Pandora

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 275    Accepted Submission(s): 108


    Problem Description
    The baseball game of planet Pandora is similar to the game of the Earth. In the game field, there are four bases which are named “home base”, “first base”, “second base” and “third base”. At the beginning, nobody is on the bases. There are two teams, one is the attacking team, and the other is the defending team.

    One by one, all players of the attacking team goes to the home base and bats the ball thrown by the defending team. 

    There are four possible results of a bat: 
    1. “Out”. In this case, the batter misses the ball, so he is disqualified and leaves the game. 

    2.“Bingle”. In this case, the batter hits the ball, but the ball doesn’t fly out of the field. Then the batter can advance to the first base, and other players of the attacking team who are already on a base can advance to next base (The next base of the third base is the home base). If a player returns to the home base, he scores one point for his team.

    3.“Allrun”. In this case, the batter hits the ball out of the field and then all the players on the bases (including the batter) can run to the home base and each scores one point for his team. So in this case, the attacking team can score at least 1 point, and at most 4 points. 

    4.“Sacrifice”. In this case, the batter chooses not to bat and leaves the field. According to the rule, in this case, the players still on the bases can advance to next base. So the player advancing to the home base this way scores one point. But if there have already been two batters who get an “Out” or a “Sacrifice” before, “Sacrifice” will end the game immediately and the attacking team can’t score any point in this “Sacrifice”.

      According to the rule, a player must leave the field immediately after he scores one point for his team. The game ends after every player of the attacking team has batted once(A “Sacrifice” is also regarded as a bat), or after there has been 3 batters who get an “Out” or an “Sacrifice”. 

    Avatar is the coach of an attacking team. He knows that the same player performs differently when the player takes different turns. For example, if you let Jack to be the first batter, he will definitely get an “Out”, but if you let him play in the third turn, he will get an “Allrun”. Avatar knows his men very well. He asked you to find out the best “batting order” for his team. If the team bats in that order, their score will be maximized.
     
    Input
    There are multiple test cases, ended by 0.

    For each test case:
    The first line contains an integer n(1<=n <=15), meaning the number of players in Avatar’s team. All players are numbered for 1 to n.

    Then a n×n matrix A follows. Aij describes what result the player i will get if he is the jth batter.( i and j start from 1 )

    Following is the meaning of the value of Aij:
    0 means the result is “Out”
    1 means the result is “Sacrifice”
    2 means the result is “Bingle”
    3 means the result is “Allrun”
     
    Output
    For each test case, print one line containing the highest score Avatar’s team can get in the game.
     
    Sample Input
    5 0 2 0 1 2 1 0 2 0 2 0 2 1 2 0 0 2 2 1 2 2 1 0 2 0 0
     
    Sample Output
    2
     
    Source
     
    Recommend
    wxl   |   We have carefully selected several similar problems for you:  3411 3407 3408 3410 3405 
     
    这题是组队赛的一题算是中等题目吧 。 
    事实上是比较水的状态压缩。
    设一个dp[i][j][k]  ..  i用2进制表示(1<=n<=15)个人batter完还是没batter , j表示垒 ,k表示out和sacrifice的次数 
    然后按给出的要求递推一下就好了 。
    还要注意一点。要限制一下状态入队。而不是出队的时候把状态continue 掉。  这样就可以省掉一些空间 , 不会MLE
     
     
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <queue>
    
    using namespace std;
    const int N = 17;
    int n,ans ;
    int x[N][N];
    int dp[1<<N][10][5];
    
    struct node
    {
        int a,b,c,w;
        node(){}
        node(int aa,int bb,int cc,int ww ){
            a=aa , b= bb ,c =cc, w =ww;
        }
    };
    
    void init(){
    
        memset( dp , -1 ,sizeof dp );
        ans = 0 ;
    }
    
    
    void bfs()
    {
        int a , b , c ,w ;
        int cnt = 0 ,aa , bb , cc ,ww;
        queue<node>que ;
        que.push(node(0,0,0,0));
    
        while( !que.empty() ){
            node u = que.front();que.pop();
            a = u.a , b = u.b  ,c = u.c ,w = u.w ;
            if( a == (1<<n) -1 || c >= 3 ) {
                ans = max ( ans , w );
                continue;
            }
    
            cnt = 0 ;
            for(int i = 0; i < n ; ++i ){
                if( a&(1<<i) )++cnt;
            }
    
            for(int i = 0; i < n ; ++i ){
                if( (a&( 1<<i )) == 0){
                    int todo = x[i][cnt];
                    aa= a|(1<<i);
                    if( todo == 0 ){
                            cc= c + 1;
                            bb = b;
                            ww = w;
                    }
                    else if( todo == 1 ){
                        if( !b ) bb = 0 ,  ww = w;
                        else if( b == 1 ) bb = 2,ww=w;
                        else if( b == 2 ) bb = 4,ww=w;
                        else if( b == 3 ) bb = 6,ww=w;
                        else if( b == 4 ) bb = 0,ww=w+1;
                        else if( b == 5 ) bb = 3,ww=w+1;
                        else if( b == 6 ) bb = 4,ww=w+1;
                        else  bb = 6,ww=w+1;
                        cc = c+1;
                    }
                    else if( todo == 2 ){
                        if( b == 0 ) bb = 1 ,ww=w;
                        else if( b == 1 )bb = 3,ww=w;
                        else if( b == 2 )bb = 5,ww=w;
                        else if( b == 3 )bb = 7,ww=w;
                        else if( b == 4 )bb = 1,ww=w+1;
                        else if( b == 5 )bb = 3,ww=w+1;
                        else if( b == 6 )bb = 5,ww=w+1;
                        else bb = 7,ww=w+1;
                        cc = c;
                    }
                    else {
                        if( !b ) ww=w+1;
                        else if( b == 1 || b==2 || b== 4 )ww=w+1;
                        else if( b == 7 )ww=w+4;
                        else ww=w+3;
                        bb = 0;
                        cc = c;
                    }
                    if( dp[aa][bb][cc] < ww ){
                        dp[aa][bb][cc] = ww;
                        que.push(node(aa,bb,cc,ww));
                    }
                }
            }
        }
    }
    
    void run()
    {
        init();
        for(int i =0 ;i < n ;++i ){
            for(int j = 0 ; j < n ;++j ){
                cin>>x[i][j];
            }
        }
        bfs();
        cout<<ans<<endl;
    }
    
    int main()
    {
        #ifdef LOCAL
            freopen("in.txt","r",stdin);
        #endif // LOCAL
        while(cin>>n){
            if(!n)break;
            run();
        }
        return 0;
    }
    only strive for your goal , can you make your dream come true ?
  • 相关阅读:
    backbone.js初体验--构建简单分页应用时踩到的坑
    使用r.js打包js文件
    javascript原型式继承
    javascript浮点数运算修正
    javascript对象的浅复制与深复制
    javascript类式继承
    初识requirejs(二)
    标准版SCADA 上线了~~ 三菱 Fanuc 广数 华中 西门子 HAAS等等 可以做到一套程序通用,采集所有CNC PLC
    KepServerEX读写三菱PLC,车间现场测试记录,带你了解【数据采集的困境】的前世与今生
    Mitsubishi (三菱) Fanuc(发那科),CNC,网口数据采集,NC程序下发(其它品牌CNC,哈斯 马扎克 兄弟等,正在开发中)
  • 原文地址:https://www.cnblogs.com/hlmark/p/3951362.html
Copyright © 2020-2023  润新知