• <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++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              74 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

            公告

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

            常用鏈接

            留言簿(4)

            我參與的團隊

            搜索

            •  

            最新隨筆

            最新評論

            • 1.?re: Poj 1279
            • 對于一個凹多邊形用叉積計算面積 后能根據(jù)結果的正負來判斷給的點集的時針方向?
            • --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
            • 呵呵..把代碼發(fā)在這里很不錯..以后我也試試...百度的編輯器太爛了....
            • --csuft1

            閱讀排行榜

            評論排行榜

            BFS預處理出包括起點和終點以及所有水果的距離,然后狀態(tài)壓縮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 閱讀(293) 評論(0)  編輯 收藏 引用
            天天综合久久一二三区| 色综合久久88色综合天天| 国产精品99久久久久久宅男| 88久久精品无码一区二区毛片 | 人妻久久久一区二区三区| 中文精品99久久国产| 久久99久国产麻精品66| 久久ZYZ资源站无码中文动漫| 97超级碰碰碰久久久久| 青青青青久久精品国产h久久精品五福影院1421 | 久久中文字幕精品| 嫩草伊人久久精品少妇AV| 久久国产乱子伦免费精品| 精品无码人妻久久久久久 | 久久人妻少妇嫩草AV无码蜜桃| 国产精品久久新婚兰兰| 国产一久久香蕉国产线看观看| 久久伊人影视| 欧美亚洲国产精品久久蜜芽 | 99久久精品费精品国产| 伊人久久无码中文字幕| 国内精品久久久久久久coent| 亚洲国产精品无码成人片久久| 51久久夜色精品国产| 人妻精品久久久久中文字幕69 | 精品久久国产一区二区三区香蕉| 2021最新久久久视精品爱| 中文字幕成人精品久久不卡| 无码AV中文字幕久久专区| 久久综合伊人77777| 99久久精品无码一区二区毛片| 狠狠色丁香久久婷婷综合五月| 久久人人爽人人爽人人片AV高清| 国产精品欧美亚洲韩国日本久久| 亚洲国产精品无码久久SM| 久久亚洲AV无码精品色午夜| 久久影院久久香蕉国产线看观看| 国产精品熟女福利久久AV| 国产精品久久毛片完整版| 久久狠狠高潮亚洲精品| 久久99久久99精品免视看动漫|