• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Topcoer SRM 453.5

            Posted on 2009-12-11 19:59 rikisand 閱讀(221) 評論(0)  編輯 收藏 引用 所屬分類: TopcoderAlgorithm

            一直沒寫,補上上次的srm~

            250pt

            500pt 隊列BFS

            Code Snippet
            template<class T> void getMin(T& a,T b){if(b<a)a=b;}
            template<class T> void getMax(T& a,T b){if(b>a)a=b;}
            #define REP(i, n) for (int i = 0; i < (n); ++i)
            #define inf 98765432
            int mp[55][55];
            struct node{
                int c;
                int r;
                int value;
                node(int rr,int cc,int vv):r(rr),c(cc),value(vv){}
            };
            class MazeMaker
            {
                    public:
                    int longestPath(vector <string> maze, int sRow, int sCol, vector <int> mRow, vector <int> mCol)
                    {
                            int R=maze.size();
                            int C=maze[0].size();
                            REP(i,R)REP(j,C)mp[i][j]=inf;
                            deque<node> q;
                            q.push_back(node(sRow,sCol,0));
                            while(!q.empty()){
                                node now=q.front();
                                q.pop_front();
                                int r=now.r;int c=now.c ;int v=now.value;
                                if( mp[r][c]!=inf)continue;
                                mp[r][c]=v;
                                for(int i=0;i<mRow.size();i++){
                                    int nr=r+mRow[i];int nc=c+mCol[i];
                                    if(nr<0||nr>=R||nc<0||nc>=C||mp[nr][nc]!=inf||maze[nr][nc]=='X')continue;
                                    q.push_back(node(nr,nc,v+1));
                                }
                            }
                            int res=-1;
                            REP(i,R)REP(j,C){
                                if(maze[i][j]=='.'){
                                    if(mp[i][j] == inf)return -1;
                                    if(mp[i][j]>res)res=mp[i][j];
                                }
                            }
                            return res;
                    }

            DFS也可以

            VS mp;
            VI mR,mC;int N,R,C; 
            int used[55][55];
            void DFS(int r,int c,int len){
                REP(i,mR.size()){
                    int nr=r+mR[i];int nc=c+mC[i];
                    if(nr<0||nr>=R||nc<0||nc>=C||mp[nr][nc]=='X')continue;
                    if(used[nr][nc]<=len+1)continue;
                    used[nr][nc]=len+1;
                    DFS(nr,nc,len+1);
                }
            }
            class MazeMaker
            {
                    public:
                    int longestPath(vector <string> maze, int sRow, int sCol, vector <int> moveRow, vector <int> moveCol)
                    {
                            mR=moveRow;mC=moveCol;mp=maze;
                            R=maze.size();C=maze[0].size();
                            REP(i,R)REP(j,C)used[i][j]=inf;
                            used[sRow][sCol]=0;
                            DFS(sRow,sCol,0);
                            int res=-1;
                            REP(i,R)REP(j,C){
                                if(mp[i][j]=='.'){
                                    if(used[i][j]==inf)return -1;
                                    if(used[i][j]>res)res=used[i][j];
                                }
                            }
                            return res;
                    }

            1000pt

            實際為求從中取出K個數字,連續兩個間的序號差不能大于maxDist 求能夠求得的最大乘積

            由于有負數的存在,最大數字的取得可能是最大的乘以最大的,或者最大的乘以最小的(正 負相乘)

            因此要保存到每一個數為止,作為第k個數,取得的最大最小值,dp求解之

             

            Code Snippet
            typedef long long int64;   

            template<class T> void getMin(T& a,T b){if(b<a)a=b;}
            template<class T> void getMax(T& a,T b){if(b>a)a=b;}
            #define REP(i, n) for (int i = 0; i < (n); ++i)
            int64 dp[55][55][2];//µÚ¼¸¸ö£¬ÓÃÁ˼¸¸ö£¬Õý»¹ÊǸº;
            #define inf 133
            class TheProduct
            {
                    public:
                    long long maxProduct(vector <int> infm, int _K, int maxD)
                    {
                        int N = infm.size();
                        memset(dp,-1,sizeof(-1));
                        REP(i,N)REP(j,51)REP(c,2)dp[i][j][c]=inf;
                        REP(i,N)  dp[i][0][0]=dp[i][0][1]=(int64)infm[i];
                        
                        for(int i=0;i<N;i++)
                            for(int j=i-1;i-j<=maxD && j>=0;j--)
                                for(int z=0;z<_K;z++){
                                    if(dp[j][z][0]!=inf){
                                        if(dp[i][z+1][0]==inf||dp[j][z][0]*infm[i]<dp[i][z+1][0])dp[i][z+1][0]=dp[j][z][0]*infm[i];
                                        if(dp[i][z+1][1]==inf||dp[j][z][0]*infm[i]>dp[i][z+1][1])dp[i][z+1][1]=dp[j][z][0]*infm[i];
                                    }
                                    if(dp[j][z][1]!=inf){
                                        if(dp[i][z+1][0]==inf||dp[j][z][1]*infm[i]<dp[i][z+1][0])dp[i][z+1][0]=dp[j][z][1]*infm[i];
                                        if(dp[i][z+1][1]==inf||dp[j][z][1]*infm[i]>dp[i][z+1][1])dp[i][z+1][1]=dp[j][z][1]*infm[i];
                                    }
                                }
                        int64 res=-(1LL<<63);
                        REP(i,N){
                            if(dp[i][_K-1][1]!=inf)
                             getMax(res,dp[i][_K-1][1]);    
                        }
                        return res;
                    }

             

             

             

             

             

             

             

             

             

             

            久久www免费人成看国产片| 久久久久黑人强伦姧人妻| 久久精品蜜芽亚洲国产AV| 一级女性全黄久久生活片免费 | 久久99热这里只频精品6| 99久久人人爽亚洲精品美女| 久久久免费观成人影院| 无码人妻久久一区二区三区免费 | 93精91精品国产综合久久香蕉| 精品视频久久久久| 久久青青草原亚洲av无码app | 久久综合狠狠综合久久97色| 国产亚洲美女精品久久久2020| 久久最近最新中文字幕大全| 久久综合五月丁香久久激情| 久久久精品人妻一区二区三区蜜桃| 久久国产精品免费| 国产成人精品久久一区二区三区| 久久久久久久国产免费看| 国产产无码乱码精品久久鸭 | 色综合久久久久综合99| 99久久久精品| 久久国产精品77777| 久久国产色av免费看| 久久亚洲色一区二区三区| 亚洲午夜久久久精品影院| 国产91色综合久久免费分享| 久久精品国产99国产精品亚洲| 亚洲精品高清一二区久久| 国产日韩欧美久久| 国产成人精品久久亚洲| 亚洲国产成人久久精品影视| 99国产欧美精品久久久蜜芽| 久久久久亚洲AV成人片| 久久精品天天中文字幕人妻| 亚洲精品白浆高清久久久久久| 国产精品久久久久久久久久影院| 亚洲精品国产自在久久| 精品久久久久久久国产潘金莲| 中文字幕久久精品| 色婷婷久久综合中文久久蜜桃av|