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

            哲學與程序

            ZOJ@3431

            ZOJ@3431
            題意:有一n層的城堡,每一層有通往下一層的樓梯。對于第i層,通往下層的樓梯在Xi,Yi處;該層有Mi個寶藏,分別給出其坐標和價值;必須在Ti時刻之前(包括)離開,否則樓梯關閉。開始處在第頂層的X,Y處,且每一個單位時刻內可以走一個單位的距離,只能往上下左右四個方向走,通過樓梯不費時間。問能否在規定時間內離開城堡,如果可以的話輸出能獲得的最大寶藏價值。
            解法:動態規劃(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 哲學與程序 閱讀(243) 評論(0)  編輯 收藏 引用 所屬分類: Algorithm

            導航

            公告

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

            常用鏈接

            隨筆分類(37)

            隨筆檔案(41)

            Algorithm

            最新隨筆

            搜索

            最新評論

            獨立博客: 哲學與程序
            久久国产精品成人免费| 亚洲狠狠综合久久| 波多野结衣久久一区二区| 亚洲婷婷国产精品电影人久久| 亚洲精品无码久久不卡| 久久中文骚妇内射| 51久久夜色精品国产| 久久精品日日躁夜夜躁欧美| 欧美一区二区精品久久| 综合久久给合久久狠狠狠97色| 久久久国产乱子伦精品作者| 香蕉久久影院| 亚洲综合精品香蕉久久网97| 人妻少妇久久中文字幕| 欧美久久久久久精选9999| 久久久亚洲欧洲日产国码二区| 久久国产乱子伦精品免费午夜| 久久精品a亚洲国产v高清不卡| 人人狠狠综合久久亚洲高清| 国产精品久久国产精麻豆99网站| 久久无码一区二区三区少妇 | 天天爽天天狠久久久综合麻豆 | 亚洲欧洲久久久精品| 久久精品亚洲精品国产色婷 | 久久精品中文字幕大胸| 精品久久人人妻人人做精品| 久久精品国产精品国产精品污| 精品久久久久久综合日本| 久久久无码精品亚洲日韩蜜臀浪潮| 国产高清美女一级a毛片久久w| 久久国产精品久久| 国产成人精品综合久久久| 精品无码久久久久久久动漫| 香蕉99久久国产综合精品宅男自| 久久乐国产综合亚洲精品| 久久天天躁狠狠躁夜夜96流白浆| 国产亚洲精品久久久久秋霞 | 国产精品青草久久久久婷婷 | 国产成人久久AV免费| 精品久久久无码人妻中文字幕豆芽| 久久91精品综合国产首页|