• <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 閱讀(214) 評論(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;
                    }

             

             

             

             

             

             

             

             

             

             

            国内精品久久人妻互换| 思思久久99热只有频精品66| 97精品国产91久久久久久| 99久久超碰中文字幕伊人| 久久精品亚洲男人的天堂| 国产精品久久久久免费a∨| 亚洲色大成网站WWW久久九九| 久久99久久99小草精品免视看| 国产精品成人精品久久久 | 久久久精品人妻一区二区三区蜜桃| 日本强好片久久久久久AAA | 久久综合亚洲色HEZYO社区| 久久精品人人做人人妻人人玩| 久久免费大片| 久久久久久久尹人综合网亚洲 | 久久天天躁狠狠躁夜夜96流白浆| 7国产欧美日韩综合天堂中文久久久久 | 久久久久久亚洲AV无码专区| 国产综合免费精品久久久| 久久婷婷激情综合色综合俺也去| 超级碰久久免费公开视频| 久久天堂AV综合合色蜜桃网| 久久久久免费视频| 99久久精品国产毛片| 久久综合综合久久97色| 人妻丰满AV无码久久不卡| 久久久久久久综合狠狠综合| 久久精品无码一区二区日韩AV| 精品久久一区二区| 99久久免费国产精品热| 亚洲乱码精品久久久久.. | 久久午夜综合久久| 国产精品伦理久久久久久| 国产一级持黄大片99久久| 狠狠色丁香婷婷久久综合不卡| 久久久免费精品re6| 久久亚洲精品成人av无码网站| 久久无码高潮喷水| 狠狠色综合网站久久久久久久高清 | 国产成人精品综合久久久| 国产ww久久久久久久久久|