• <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>
            獨立博客: 哲學(xué)與程序

            哲學(xué)與程序

            ZOJ@3431

            ZOJ@3431
            題意:有一n層的城堡,每一層有通往下一層的樓梯。對于第i層,通往下層的樓梯在Xi,Yi處;該層有Mi個寶藏,分別給出其坐標(biāo)和價值;必須在Ti時刻之前(包括)離開,否則樓梯關(guān)閉。開始處在第頂層的X,Y處,且每一個單位時刻內(nèi)可以走一個單位的距離,只能往上下左右四個方向走,通過樓梯不費(fèi)時間。問能否在規(guī)定時間內(nèi)離開城堡,如果可以的話輸出能獲得的最大寶藏價值。
            解法:動態(tài)規(guī)劃(DP)。
            // 2386571      2011-01-15 16:32:37        Accepted      3431      C++      130      416      redsea
            #include<iostream>
            #include
            <algorithm>
            #include
            <cstdio>
            #include
            <string.h>
            using namespace std;
            struct Floor{
                
            int m;
                
            int x[8], y[8], value[8];
                
            int t[257],v[257];
            }p[
            105];
            int st[105];

            int f[2][1205];

            inline 
            int abs(int a)
            {
                
            return (a>0?a:-a);
            }
            int main()
            {
                
            int T;
                
            int x, y, n;
                scanf(
            "%d",&T);
                
            while(T--)
                {
                    scanf(
            "%d",&n);
                    scanf(
            "%d%d",&x,&y);
                    p[
            0].x[0= x;
                    p[
            0].y[0= y;
                    scanf(
            "%d%d",&x,&y);
                    p[
            0].x[1= x;
                    p[
            0].y[1= y;
                    
            for(int i = 1; i < n; i++)
                    {
                        p[i].x[
            0= p[i-1].x[1];
                        p[i].y[
            0= p[i-1].y[1];
                        scanf(
            "%d%d",&x,&y);
                        p[i].x[
            1= x;
                        p[i].y[
            1= y;
                    }
                    
            for(int i = 0; i < n; i++){
                        p[i].value[
            0= p[i].value[1= 0;
                        scanf(
            "%d",&p[i].m);
                        
            for(int j = 0; j < p[i].m; j++){
                            scanf(
            "%d%d%d",&p[i].x[2+j], &p[i].y[2+j], &p[i].value[2+j]);
                        }
                    }
                    
            for(int i = 0; i < n; i++){
                        scanf(
            "%d"&st[i]);
                    }
                    
            for(int i = 0; i < n; i++)
                        
            for(int j = 0; j < 256; j++){
                            p[i].t[j] 
            = -1;
                            p[i].v[j] 
            = -1;
                        }
                    
            for(int i = 0; i < n; i++)
                    {
                        
            int a[6], b[9];
                        
            for(int j = 0; j < p[i].m; j++){
                            a[j] 
            = j+2;
                        }
                        p[i].t[
            3= abs(p[i].x[0]-p[i].x[1]) + abs(p[i].y[0]-p[i].y[1]);
                        p[i].v[
            3= 0;
                        b[
            0= 0;
                        
            do{
                            
            for(int j = 0; j < p[i].m; j++)
                            {
                                b[j
            +1= a[j];
                                b[j
            +2= 1;
                                
            int value = 0;
                                
            int t = 0;
                                
            int s = 0;
                                s 
            = s | (1<<b[0]);
                                
            for(int k = 1; k < j+3; k++){
                                    s 
            = s|(1<<b[k]);
                                    t 
            += abs(p[i].x[b[k]] - p[i].x[b[k-1]]) + abs(p[i].y[b[k]]-p[i].y[b[k-1]]);
                                    value 
            += p[i].value[b[k]];
                                }
                                
            if(p[i].t[s]<0 || p[i].t[s] > t){
                                    p[i].t[s] 
            = t;
                                    p[i].v[s] 
            = value;
                                }
                            }
                        }
            while(next_permutation(a,a+p[i].m));
                    }
                    memset(f,
            -1,sizeof(f));
                    f[
            0][0= 0;
                    
            int a = 1, b = 0;
                    
            for(int i = 0; i < n; i++)
                    {
                        a 
            = 1-a;
                        b 
            = 1-b;
                        
            for(int j = 0; j < 256; j++){
                            
            if(p[i].t[j] < 0 || p[i].v[j] < 0)continue;
                            
            for(int k = st[i]; k >= 0; k--){
                                
                                
            if(f[a][k] >= 0 && k+p[i].t[j] <= st[i] && f[b][k+p[i].t[j]] < f[a][k]+p[i].v[j])
                                
                                    f[b][k
            +p[i].t[j]] = f[a][k]+p[i].v[j];
                            }
                        }
                        
            if(i==0)
                            f[a][
            0= -1;
                        
            else{
                            
            for(int j = 0; j <= st[i-1]; j++)
                                f[a][j] 
            = -1;
                        }
                    }
                    
            int ans = -1;
                    
            for(int i = 0; i <= st[n-1]; i++)
                    {
                        
            if(f[b][i]>ans)ans = f[b][i];
                    }
                    
            if(ans>=0)printf("%d\n",ans);
                    
            else printf("I'm doomed, though I fought bravely\n");
                }
                
            return 0;
            }

            posted on 2011-01-15 16:42 哲學(xué)與程序 閱讀(235) 評論(0)  編輯 收藏 引用 所屬分類: Algorithm

            導(dǎo)航

            公告

            歡迎訪問 http://zhexue.sinaapp.com

            常用鏈接

            隨筆分類(37)

            隨筆檔案(41)

            Algorithm

            最新隨筆

            搜索

            最新評論

            獨立博客: 哲學(xué)與程序
            99久久99这里只有免费的精品| 国产成人精品综合久久久| 模特私拍国产精品久久| 97久久婷婷五月综合色d啪蜜芽| 久久无码人妻一区二区三区 | 国内精品久久久久久久涩爱| 成人午夜精品久久久久久久小说| 少妇久久久久久被弄到高潮 | 久久香蕉一级毛片| 久久婷婷色综合一区二区| 色偷偷久久一区二区三区| 国产亚洲精久久久久久无码AV| 2019久久久高清456| 亚洲成色999久久网站| 午夜精品久久久久久久| 日日狠狠久久偷偷色综合96蜜桃| 久久99热国产这有精品| 精品国产乱码久久久久软件| 国产精品gz久久久| 99久久99久久| 国产精品美女久久久久久2018| 性做久久久久久久久| 精品国产综合区久久久久久 | 伊人久久一区二区三区无码| 久久精品国产精品国产精品污| 亚洲精品美女久久久久99| 亚洲精品NV久久久久久久久久 | 久久精品综合一区二区三区| 国内精品久久久久影院日本 | 久久人人添人人爽添人人片牛牛| 精品免费久久久久国产一区| 久久噜噜电影你懂的| 精品久久一区二区三区| 欧美日韩中文字幕久久伊人| 精品久久久久久无码中文字幕一区| 99久久国产宗和精品1上映| 久久人人爽人人爽人人爽 | 99久久国产精品免费一区二区| 久久精品视频一| 亚洲欧美成人综合久久久| 丁香色欲久久久久久综合网|