• <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 哲學與程序 閱讀(235) 評論(0)  編輯 收藏 引用 所屬分類: Algorithm

            導航

            公告

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

            常用鏈接

            隨筆分類(37)

            隨筆檔案(41)

            Algorithm

            最新隨筆

            搜索

            最新評論

            獨立博客: 哲學與程序
            亚洲综合伊人久久综合| 久久99热国产这有精品| 久久夜色精品国产| 亚洲精品国产成人99久久| 97精品伊人久久久大香线蕉| 91精品国产综合久久四虎久久无码一级| 亚洲狠狠婷婷综合久久久久| 久久婷婷成人综合色综合| 久久综合丁香激情久久| 国产成人精品久久| 午夜精品久久久久久毛片| 91视频国产91久久久| 欧美与黑人午夜性猛交久久久| 久久久久国产精品麻豆AR影院 | 一本色综合网久久| 久久久久久亚洲精品不卡 | 成人久久综合网| 久久久久久国产精品美女| 久久九九久精品国产| 久久精品亚洲日本波多野结衣| 久久伊人五月丁香狠狠色| 偷偷做久久久久网站| 91久久精品国产成人久久| 无码人妻久久久一区二区三区 | 久久久久综合国产欧美一区二区| 国产精品99久久久久久人| 日本精品久久久久中文字幕8| 日本久久久精品中文字幕| 人人狠狠综合久久亚洲| 久久综合视频网| 欧洲人妻丰满av无码久久不卡| 久久久久人妻一区精品色| 亚洲国产精品久久| 亚洲美日韩Av中文字幕无码久久久妻妇 | 亚洲精品乱码久久久久久蜜桃 | 久久久久亚洲av毛片大| 午夜人妻久久久久久久久| 精品综合久久久久久88小说| 久久精品亚洲AV久久久无码| 精品乱码久久久久久久| 久久WWW免费人成—看片|