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

             

             

             

             

             

             

             

             

             

             

            久久久久国产视频电影| 777午夜精品久久av蜜臀| 精品久久久久久国产免费了| 日批日出水久久亚洲精品tv| 色欲综合久久躁天天躁蜜桃 | 久久久久噜噜噜亚洲熟女综合| 手机看片久久高清国产日韩| 久久综合久久自在自线精品自| 丁香五月综合久久激情| 亚洲国产另类久久久精品| 国产国产成人久久精品| 三上悠亚久久精品| 国产精品久久久久久久久软件| 99麻豆久久久国产精品免费| 久久久久国产精品人妻| 国产高清国内精品福利99久久| 欧洲成人午夜精品无码区久久| 欧美久久综合九色综合| 色综合久久精品中文字幕首页| 无码专区久久综合久中文字幕| 色诱久久av| 亚洲七七久久精品中文国产| 久久精品18| 久久久久亚洲精品中文字幕| 99国内精品久久久久久久 | 手机看片久久高清国产日韩| www亚洲欲色成人久久精品| 久久97精品久久久久久久不卡| 亚洲国产精品无码久久久不卡| 久久精品人妻中文系列| 亚洲欧洲久久av| 伊人久久大香线蕉av一区| 7777久久久国产精品消防器材| 99久久无色码中文字幕人妻| 久久久久久精品免费看SSS | 久久久久18| 亚洲精品WWW久久久久久| 国产99久久久国产精品小说| 少妇无套内谢久久久久| 久久99久久99精品免视看动漫| 亚洲AV无码一区东京热久久|