• <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>

            糯米

            TI DaVinci, gstreamer, ffmpeg
            隨筆 - 167, 文章 - 0, 評(píng)論 - 47, 引用 - 0
            數(shù)據(jù)加載中……

            POJ 2430 Lazy Cows 動(dòng)態(tài)規(guī)劃

            屬于狀態(tài)型的動(dòng)態(tài)規(guī)劃,特難搞的那一類(lèi),狀態(tài)一多,轉(zhuǎn)換的時(shí)候難免遺漏一兩個(gè)。
            這題還算,借助數(shù)據(jù)搞出來(lái)了,漏了兩個(gè)轉(zhuǎn)移,結(jié)果一組數(shù)據(jù)過(guò)不了。
            后來(lái)加上就AC了,時(shí)間還行,32MS。

            思路:
            從左往右開(kāi)始放矩形,假設(shè)現(xiàn)在準(zhǔn)備擺放第i列之后的矩形。
            實(shí)際上我們只關(guān)注第i-1列是怎么擺的,前面怎么擺都無(wú)所謂。
            所以,
            第i列牛的狀態(tài) + 第i-1列擺放的狀態(tài) -> 第i列擺放的狀態(tài)
            擺放的狀態(tài)有五種:
            1. 光上面有
            2. 光下面有
            3. 上下都有但不屬于同一個(gè)矩形
            4. 空
            5. 上下都有并且屬于同一個(gè)矩形
            牛的狀態(tài)有四種,就是1~4。

            然后就看怎么推了,詳見(jiàn)代碼。
            代碼中對(duì)狀態(tài)的定義也是按照上面的順序。

            在網(wǎng)上找解題報(bào)告,發(fā)現(xiàn)有的大牛代碼很短很快很牛逼!佩服!

            ps:
            一開(kāi)始這份代碼用g++和gcc提交是WA的,但c++提交可以AC。
            我在本地測(cè)試了一下,發(fā)現(xiàn)g++和gcc編譯后,數(shù)據(jù)是跑得過(guò)的。我的gcc版本很高,是4.3.3。
            不知道是北大的網(wǎng)站有問(wèn)題,還是我的代碼有問(wèn)題。不過(guò)后者可能性大很多。
            后來(lái),我把inline去掉(#define inline),再用g++、gcc提交,就過(guò)了!
            很想不通,寫(xiě)其他代碼的時(shí)候,也是gcc編譯的,不都是這樣寫(xiě) inline 的嗎,也沒(méi)見(jiàn)出什么問(wèn)題,也不可能出問(wèn)題。
            所以希望高手給指點(diǎn)一下!謝謝!


            代碼:

            #include <stdio.h>
            #include 
            <stdlib.h>

            enum {
                UP, DOWN, UPDOWN, SPACE, CONN
            }
            ;

            #define MAX_N 1024
            #define MAX_AREA (15000000 * 2)

            #define inline

            struct cow_node {
                
            int y, x;
            }
            ;
            int dp[2][5][MAX_N], (*cur)[MAX_N], (*pre)[MAX_N];
            struct cow_node cows[MAX_N];
            int N, K, B, max_k;

            int cmp(const void *a, const void *b)
            {
                
            return ((struct cow_node *)a)->- ((struct cow_node *)b)->x;
            }


            inline 
            int min(int a, int b)
            {
                
            return a < b ? a : b;
            }


            inline 
            void swap(void *a, void *b)
            {
                
            void *= *(void **)a;
                
            *(void **)a = *(void **)b;
                
            *(void **)b = t;
            }


            inline 
            void init(int (*t)[MAX_N])
            {
                
            int i;

                
            for (i = 0; i <= max_k + 4; i++
                    t[
            0][i] = t[1][i] = t[2][i] = t[3][i] = t[4][i] = MAX_AREA;
            }


            #if 0
            inline 
            void dump(int (*t)[MAX_N], int ptn)
            {
            #define dbp printf
                
            int i, j;
                
            const char *strs[] = {
                    
            "up""down""updown""space""conn"
                }
            ;
                
            const char *ptns[] = {
                    
            "*\n\n""\n*\n""*\n*\n""\n\n" 
                }
            ;

                dbp(
            "---------\n%s", ptns[ptn]);
                
            for (i = 0; i < 5; i++{
                    dbp(
            "%s: ", strs[i]);
                    
            for (j = 0; j <= max_k; j++)
                        dbp(
            "%d->%d ", j, t[i][j]);
                    dbp(
            "\n");
                }

                dbp(
            "\n");
            #undef dbp
            }

            #else
            #define dump() {}
            #endif

            inline 
            void calc(int ptn, int space_cnt)
            {
                
            int i;

            #define UPDATE(_from, _to, _a_used, _k_used) \
                cur[_to][i 
            + _k_used] = min(cur[_to][i + _k_used], pre[_from][i] + _a_used)
                
            #define CASE(_ptn, _code) \
                
            if (ptn == _ptn) {    \
                    
            for (i = 0; i <= max_k; i++) \
                        _code    \
                }

                
                init(cur);

                CASE(UP, 
            {
                    UPDATE(UP, UP, 
            10);
                    UPDATE(UPDOWN, UP, 
            10);
                    UPDATE(UPDOWN, UPDOWN, 
            20);
                    UPDATE(DOWN, UP, 
            11);
                    UPDATE(DOWN, UPDOWN, 
            21);
                    UPDATE(CONN, CONN, 
            20);
                    UPDATE(CONN, UP, 
            11);
                    UPDATE(SPACE, UP, 
            11);
                    UPDATE(SPACE, CONN, 
            21);
                }
            );

                CASE(DOWN, 
            {
                    UPDATE(DOWN, DOWN, 
            10);
                    UPDATE(UPDOWN, DOWN, 
            10);
                    UPDATE(UPDOWN, UPDOWN, 
            20);
                    UPDATE(UP, DOWN, 
            11);
                    UPDATE(UP, UPDOWN, 
            21);
                    UPDATE(CONN, CONN, 
            20);
                    UPDATE(CONN, DOWN, 
            11);
                    UPDATE(SPACE, DOWN, 
            11);
                    UPDATE(SPACE, CONN, 
            21);
                }
            );

                CASE(UPDOWN, 
            {
                    UPDATE(UP, UPDOWN, 
            21);
                    UPDATE(UPDOWN, UPDOWN, 
            20);
                    UPDATE(DOWN, UPDOWN, 
            21);
                    UPDATE(CONN, CONN, 
            20);
                    UPDATE(SPACE, CONN, 
            21);
                    UPDATE(SPACE, UPDOWN, 
            22);
                }
            );

                CASE(SPACE, 
            {
                    UPDATE(UP, SPACE, 
            00);
                    UPDATE(UP, UP, space_cnt, 
            0);
                    UPDATE(DOWN, SPACE, 
            00);
                    UPDATE(DOWN, DOWN, space_cnt, 
            0);
                    UPDATE(UPDOWN, SPACE, 
            00);
                    UPDATE(UPDOWN, UPDOWN, space_cnt
            *20);
                    UPDATE(UPDOWN, UP, space_cnt, 
            0);
                    UPDATE(UPDOWN, DOWN, space_cnt, 
            0);
                    UPDATE(CONN, SPACE, 
            00);
                    UPDATE(CONN, CONN, space_cnt
            *20);
                    UPDATE(SPACE, SPACE, 
            00);
                }
            );

            #undef UPDATE
            #undef CASE

                dump(cur, ptn);

                swap(
            &cur, &pre);
            }



            int main()
            {
                
            int i;

                freopen(
            "e:\\test\\in.txt""r", stdin);

                scanf(
            "%d%d%d"&N, &K, &B);
                
            for (i = 0; i < N; i++
                    scanf(
            "%d%d"&cows[i].y, &cows[i].x);
                qsort(cows, N, 
            sizeof(cows[0]), cmp);

                cur 
            = dp[0];
                pre 
            = dp[1];
                max_k 
            = 2;
                init(pre);
                pre[SPACE][
            0= 0;
                
            for (i = 0; i < N; ) {
                    max_k 
            = min(i + 2, K);
                    
            if (i && cows[i - 1].x + 1 != cows[i].x) 
                        calc(SPACE, cows[i].x 
            - cows[i - 1].x - 1);
                    
            if (i + 1 < N && cows[i + 1].x == cows[i].x) {
                        calc(UPDOWN, 
            0);
                        i 
            += 2;
                    }
             else {
                        calc(cows[i].y 
            == 1 ? UP : DOWN, 0);
                        i
            ++;
                    }

                }

                calc(SPACE, 
            0);

                printf(
            "%d\n", pre[SPACE][K]);

                
            return 0;
            }


            posted on 2010-04-13 12:19 糯米 閱讀(1000) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): POJ

            狠狠干狠狠久久| 久久久国产打桩机| 久久久久人妻一区精品色| 久久综合狠狠综合久久97色| 91精品国产高清久久久久久国产嫩草| 伊人久久综合无码成人网| 亚洲国产日韩欧美综合久久| 久久亚洲国产精品123区| 久久久国产一区二区三区| 久久99精品免费一区二区| 国产精品99久久久久久猫咪| 亚洲国产精品久久66| 国产综合精品久久亚洲| 精品人妻伦九区久久AAA片69| 国产精品九九久久免费视频| 久久高潮一级毛片免费| 亚洲欧美另类日本久久国产真实乱对白 | 久久久久久狠狠丁香| 国产精品久久久久影视不卡| 国产精品久久久久久福利69堂| 国产精品一区二区久久| 色综合久久中文色婷婷| 人人狠狠综合久久亚洲高清| 久久久亚洲AV波多野结衣| 精品久久久噜噜噜久久久 | 99麻豆久久久国产精品免费| 久久99精品久久只有精品| 99久久免费只有精品国产| 久久综合鬼色88久久精品综合自在自线噜噜 | 久久久久99精品成人片| 一级a性色生活片久久无| 亚洲va中文字幕无码久久不卡| 欧美精品一本久久男人的天堂 | 欧美精品九九99久久在观看| 亚洲中文久久精品无码| 伊人色综合久久天天| 波多野结衣久久精品| 波多野结衣中文字幕久久| 久久久久综合国产欧美一区二区| 亚洲精品美女久久久久99| 999久久久国产精品|