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

             

             

             

             

             

             

             

             

             

             

            久久天天躁狠狠躁夜夜2020 | 日韩美女18网站久久精品| 99久久精品国产一区二区| 久久精品视频一| 亚洲国产日韩欧美久久| 大蕉久久伊人中文字幕| 亚洲国产精品一区二区久久| 久久精品欧美日韩精品| 国产精品福利一区二区久久| 99国产精品久久| 国产真实乱对白精彩久久| 精品久久久久一区二区三区 | 狠狠色综合网站久久久久久久| 久久99精品国产一区二区三区| 国产精品VIDEOSSEX久久发布| 久久免费高清视频| 国产日韩欧美久久| 亚洲国产成人精品女人久久久 | 97精品伊人久久久大香线蕉| 国产免费久久久久久无码| 欧美亚洲另类久久综合婷婷| 精品人妻伦九区久久AAA片69| 久久久无码精品亚洲日韩蜜臀浪潮| 乱亲女H秽乱长久久久| 免费观看久久精彩视频| 一本久久a久久精品综合香蕉| 亚洲综合伊人久久大杳蕉| 国内精品久久久久久野外| 久久国产成人| 丰满少妇高潮惨叫久久久| 久久青青草原国产精品免费| 午夜福利91久久福利| 国产精品美女久久久久久2018 | 久久久久国产一级毛片高清板| 人人狠狠综合久久亚洲| 国产人久久人人人人爽| 2021最新久久久视精品爱| 国产精品久久网| 久久久噜噜噜久久熟女AA片| 蜜臀久久99精品久久久久久| 久久精品国产91久久麻豆自制|