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

            學習心得(code)

            superlong@CoreCoder

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              74 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

            公告

            文字可能放在http://blog.csdn.net/superlong100,此處存放代碼

            常用鏈接

            留言簿(4)

            我參與的團隊

            搜索

            •  

            最新隨筆

            最新評論

            • 1.?re: Poj 1279
            • 對于一個凹多邊形用叉積計算面積 后能根據結果的正負來判斷給的點集的時針方向?
            • --bsshanghai
            • 2.?re: Poj 3691
            • 你寫的這個get_fail() 好像并是真正的get_fail,也是說fail指向的串并不是當前結點的子串。為什么要這樣弄呢?
            • --acmer1183
            • 3.?re: HDU2295[未登錄]
            • 這個是IDA* 也就是迭代加深@ylfdrib
            • --superlong
            • 4.?re: HDU2295
            • 評論內容較長,點擊標題查看
            • --ylfdrib
            • 5.?re: HOJ 11482
            • 呵呵..把代碼發在這里很不錯..以后我也試試...百度的編輯器太爛了....
            • --csuft1

            閱讀排行榜

            評論排行榜

            BFS預處理出包括起點和終點以及所有水果的距離,然后狀態壓縮DP.
            #include <stdio.h>
            #include 
            <ctime>
            #include 
            <stdlib.h>
            #include 
            <string.h>

            const int N = 260;
            const int M = 20;

            struct node {
                
            int x, y;
                
            void get(int a, int b) {
                    x 
            = a; y = b;
                }
                
            void write() {
                    printf(
            "%d %d\n", x, y);
                }
            };

            int n, m;
            int ini[N][N];
            int id[N][N];
            node vaild[M];
            int vlen;
            bool h[N][N];
            int dis[M][M];
            int mv[4][2= {{1,0}, {-10}, {01}, {0-1}};
            int f[18][(1<<18)];
            int s[(1<<18)][18];
            int slen[(1<<18)][2];
            int w[M];

            inline 
            int max(int a, int b ){ return a > b ? a : b;}

            void init() {
                memset( id, 
            0sizeof( id ));
                vlen 
            = 0;
                
            int cnt = 0;
                
            for(int i = 0; i < n; i ++) {
                    
            for(int j = 0; j < m; j ++) {
                        scanf(
            "%d", ini[i] + j);
                        
            if( i == 0 && j == 0 ) {
                            vaild[vlen
            ++].get(i, j);
                            id[i][j] 
            = ++cnt;
                        }
                        
            else if( ini[i][j] > 0 ) {
                            vaild[vlen
            ++].get(i, j);
                            id[i][j] 
            = ++cnt;
                        }
                        
            else if( i == n-1 && j == m-1 ) {
                            vaild[vlen
            ++].get(i, j);
                            id[i][j] 
            = ++cnt;
                        }
                    }
                }
            }

            node que[N
            *N*10];
            int head, tail, flag, step;

            inline 
            void pre() {
                head 
            = tail = 0;
                memset(h, 
            0sizeof( h));
                step 
            = 0;
            }

            inline 
            bool isok(node a) {
                
            if( a.x < 0 || a.x >= n || a.y < 0 || a.y >= m ) return false;
                
            if( ini[a.x][a.y] == -1 || h[a.x][a.y] ) return false;
                
            return true;
            }

            inline 
            void expand(node now) {
                
            for(int i = 0; i < 4; i ++) {
                    node next;
                    next.
            get(now.x+mv[i][0], now.y+mv[i][1]);
                    
            if( isok(next) ) {
                        que[
            ++tail] = next;
                        h[next.x][next.y] 
            = 1;
                    }
                }
            }

            void bfs() {
                memset(dis, 
            -1 ,sizeof(dis));
                
            for(int i = 0; i < vlen; i ++) {
                    pre();
                    node ori 
            = vaild[i];
                    que[
            ++tail] = ori;
                    h[ori.x][ori.y] 
            = 1;
                    
            while( head < tail ) {
                        
            int size = tail - head;
                        
            while( size -- ) {
                            node now 
            = que[++head];
                            expand(now);
                            
            int d = id[now.x][now.y];
                            
            if( d > 0 ) dis[i][d-1= step;
                        }
                        step 
            ++;
                    }
                }
            }

            void dp() {
                
            if( dis[0][vlen-1< 0 ) {
                    puts(
            "you loss!");
                    
            return;
                }
                
            int mm = (1<<(vlen-1));
                
            for(int i = 0; i < mm; i ++for(int j = 0 ; j < vlen-1; j ++) f[j][i] = -1;
                
            for(int i = 0; i < vlen; i ++) {
                    w[i] 
            = ini[vaild[i].x][vaild[i].y];
                }
                
            for(int i = 0; i < vlen-1; i ++)
                    
            if( w[0>= dis[0][i+1&& dis[0][i+1>= 0)    {
                        f[i][
            1<<i] = w[0+ w[i+1-dis[0][i+1];
                    }
                
            for(int i = 1; i < mm; i ++) {
                    
            int lenj = slen[i][0];
                    
            int lenk = slen[i][1];
                    
            for(int jj = 0; jj < lenj; jj ++) {
                        
            int j = s[i][jj];
                        
            if( j < vlen-1)
                        
            for(int kk = lenj; kk < lenj+lenk; kk ++) {
                            
            int k = s[i][kk];
                            
            int news = ( i|(1<<j) );
                            
            if( k<vlen-1 && f[k][i] >= dis[k+1][j+1&& dis[k+1][j+1>= 0 ) {
                                f[j][i
            |(1<<j)] = max( f[j][i|(1<<j)], f[k][i] - dis[k+1][j+1]+ w[j+1] );
                            }
                        }
                    }
                }
                
            int ans = -1, t;
                
            if( w[0>= dis[0][vlen-1&& dis[0][vlen-1]>=0 ) ans = w[0- dis[0][vlen-1];
                
            for(int i = 1; i < mm; i ++){
                    
            for(int j = 0; j < vlen-1; j ++) {
                        t 
            = dis[j+1][vlen-1];
                        
            if( t >= 0 && f[j][i] >= t )
                        ans 
            = max(ans, f[j][i]-t);
                    }
                }
                
            if(w[0== 0) ans = -1;
                
            if( dis[0][vlen-1== 0 ) ans = w[0];
                
            if( ans < 0 )     puts("you loss!");
                
            else            printf("%d\n", ans);
            }

            void best() {
                
            int mm = (1<<17);
                
            for(int i = 1; i < mm; i ++) {
                    slen[i][
            0= slen[i][1= 0;
                    
            for(int j = 0; j < 17; j ++if( (i & (1<<j)) == 0 ) s[i][slen[i][0]++= j;
                    
            for(int j = 0; j < 17; j ++if( (i & (1<<j)) != 0 ) s[i][slen[i][0]+slen[i][1]++= j;
                }
            }
            int main() {
                best();
                
            int tt = clock();
                freopen(
            "in.txt","r",stdin);
                
            while( scanf("%d %d"&n, &m) != EOF) {
                    init();
                    bfs();
                    dp();
                }
                printf(
            "%d\n", clock() - tt);
                
            while(1);
            }


            posted on 2010-08-04 16:20 superlong 閱讀(291) 評論(0)  編輯 收藏 引用
            国产精品欧美久久久久天天影视| 日韩精品久久无码中文字幕| 久久久WWW成人免费毛片| 久久最新免费视频| 久久发布国产伦子伦精品| 婷婷综合久久中文字幕| 四虎久久影院| 情人伊人久久综合亚洲| 精品久久久无码21p发布| 99久久99久久精品国产片果冻| 婷婷久久五月天| 久久亚洲精品中文字幕三区| 狠狠精品久久久无码中文字幕| 一本大道久久a久久精品综合| 一本久道久久综合狠狠躁AV| 久久精品国产亚洲网站| 无码人妻精品一区二区三区久久| 国产精品综合久久第一页| 久久亚洲日韩精品一区二区三区| 合区精品久久久中文字幕一区| 精品一区二区久久| 国产精品久久久久影视不卡| 久久免费看黄a级毛片| 久久精品国产清自在天天线| 国产精品99久久精品| 久久亚洲精品中文字幕| 久久人人爽人人澡人人高潮AV| 一级做a爰片久久毛片人呢| 91精品国产综合久久婷婷| 久久久久99精品成人片欧美 | 亚洲人成网亚洲欧洲无码久久 | 亚洲国产成人精品女人久久久 | 93精91精品国产综合久久香蕉| 亚洲午夜久久久久久久久电影网| 噜噜噜色噜噜噜久久| 色婷婷综合久久久久中文字幕| 久久久久婷婷| 久久丫忘忧草产品| 中文无码久久精品| 久久精品国产久精国产思思| 久久综合丝袜日本网|