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

            哲學(xué)與程序

            ZOJ@3431

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

            導(dǎo)航

            公告

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

            常用鏈接

            隨筆分類(37)

            隨筆檔案(41)

            Algorithm

            最新隨筆

            搜索

            最新評(píng)論

            獨(dú)立博客: 哲學(xué)與程序
            国产精品青草久久久久婷婷 | 囯产精品久久久久久久久蜜桃| 久久久久久九九99精品| 久久综合久久美利坚合众国| 久久久噜噜噜久久中文字幕色伊伊| 国产精品一久久香蕉国产线看| 久久精品夜夜夜夜夜久久| 日韩va亚洲va欧美va久久| yellow中文字幕久久网| 久久91精品综合国产首页| 精品久久国产一区二区三区香蕉| 久久免费视频网站| 99精品久久久久久久婷婷| 国产午夜精品久久久久九九| 久久国产免费| 天天做夜夜做久久做狠狠| 久久婷婷五月综合国产尤物app | 久久精品这里只有精99品| 国产精品欧美亚洲韩国日本久久| 国产一区二区精品久久凹凸| 亚洲精品tv久久久久| 亚洲AV日韩AV永久无码久久 | 久久精品国产亚洲AV香蕉| 国产精品无码久久综合| 91超碰碰碰碰久久久久久综合| 精品国产婷婷久久久| 综合久久一区二区三区| 日韩AV无码久久一区二区 | 丁香久久婷婷国产午夜视频| 亚洲国产精品无码久久久久久曰| 久久久久久国产精品无码下载| 91精品国产综合久久久久久| 久久精品18| 成人国内精品久久久久一区| 久久久久无码国产精品不卡| 日产精品久久久久久久性色 | 久久国产视屏| 久久夜色精品国产噜噜亚洲AV| 色综合色天天久久婷婷基地| 狠狠色丁香久久婷婷综合| 国产叼嘿久久精品久久|