• <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;
                    }

             

             

             

             

             

             

             

             

             

             

            免费国产99久久久香蕉| 久久人人爽人人人人爽AV| 99久久超碰中文字幕伊人| 26uuu久久五月天| 色欲综合久久躁天天躁| 久久久久无码精品国产不卡| 国产精品免费久久| 中文字幕人妻色偷偷久久| 国产亚洲精品自在久久| 久久精品国产只有精品66| 久久久久久亚洲AV无码专区| 国产精品成人精品久久久| 无码人妻久久一区二区三区免费 | 久久精品无码一区二区日韩AV| 欧美午夜精品久久久久久浪潮| 亚洲午夜久久久久妓女影院| 九九久久精品国产| 97久久精品人妻人人搡人人玩| 欧美日韩中文字幕久久久不卡| 国产精品久久久久影院嫩草| 久久婷婷五月综合97色直播| 久久99国产精品二区不卡| 久久精品国产男包| 久久经典免费视频| 久久久久亚洲精品中文字幕| 久久AⅤ人妻少妇嫩草影院| AAA级久久久精品无码片| 久久精品青青草原伊人| 欧美久久一级内射wwwwww.| 久久九九免费高清视频| 国产精品丝袜久久久久久不卡| 9久久9久久精品| 97久久香蕉国产线看观看| 国产精品99久久免费观看| 国内精品人妻无码久久久影院| 亚洲色欲久久久综合网| 欧洲精品久久久av无码电影| 一本一本久久a久久综合精品蜜桃 一本一道久久综合狠狠老 | 99久久精品国内| 久久精品视频免费| 国产福利电影一区二区三区久久久久成人精品综合 |