• <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>
            心如止水
            Je n'ai pas le temps
            posts - 400,comments - 130,trackbacks - 0
            我很少寫較長(zhǎng)的題解,但是對(duì)于這一題我覺得很有必要。
            對(duì)于這道題,首先應(yīng)該想到貪心:每次取差值最小的一對(duì)。但是這樣的貪心策略很容易找到反例,而且N=5000的數(shù)據(jù)規(guī)模,十分有可能是O(n^2)的算法。
            于是考慮動(dòng)態(tài)規(guī)劃。如果是DP,那么很容易想到如下的狀態(tài)定義:d[i][j]表示用前j個(gè)數(shù)組成i個(gè)(x,y,z)數(shù)對(duì)的最小消耗。
            另外一個(gè)很容易注意到的地方就是:對(duì)于一個(gè)最優(yōu)決策中的任意一個(gè)數(shù)對(duì)(x,y,z),其中x和y必在有序的a[i]中相鄰。關(guān)于這點(diǎn)用反證法不難證明,也很容易注意到。
            對(duì)于(x,y,z)中的z應(yīng)該如何決策的問題,之前一直令我迷惑,這一點(diǎn)應(yīng)該是題目最難解決的問題。

            考慮狀態(tài)d[i][j]:
                對(duì)于x和y,有如下考慮:
                    對(duì)于a[j],如果不使用a[j],那么d[i][j]=d[i][j-1];
                    如果使用a[j],那么就和a[j-1]一起使用,d[i][j]=d[i-1][j-2]+w(a[i],a[i-1]);
                于是有了總的狀態(tài)轉(zhuǎn)移方程:d[i][j]=min{d[i][j-1],d[i-1][j-2]+w(a[i],a[i-1])};
                這應(yīng)該不難理解,但是對(duì)于z的決策呢?
                如果把a(bǔ)[i]按降序排列,那么z的影響就可以忽略了!這樣依然可以采用上面的方程。

            考慮狀態(tài)d[i][j]:
                如果j<3i,此時(shí)當(dāng)前策略是不可行的,d[i][j]=INF;
                如果j>=3i,即j>=3(i-1)+3,j>3(i-1)+2,當(dāng)前狀態(tài)有效
                    轉(zhuǎn)移到d[i-1][j-2]時(shí),至少剩余一個(gè)多余的a[k]
                    由于序列降序,a[k]可以和a[j]、a[j-1]配對(duì)
                    同時(shí)d[i-1][j-2]有效,可以繼續(xù)遞歸。
                    轉(zhuǎn)移到d[i][j-1]
                    若d[i][j-1]為無效狀態(tài),d[i][j-1]==INF,必然不會(huì)比上面那種轉(zhuǎn)移方式優(yōu);
                    若d[i][j-1]為有效狀態(tài),可以繼續(xù)遞歸地進(jìn)行下去。

            以下是我的代碼,采用的記憶化搜索:
            #include<stdio.h>
            #include
            <string.h>
            const long maxn=5007,INF=100000007;
            long k,n,r[maxn],d[1007][maxn],w[maxn];
            long min(long a,long b)
            {
                
            return (a<b?a:b);
            }
            void swap(long &a,long &b)
            {
                
            long t=a;a=b;b=t;
            }
            long dp(long kk,long nn)
            {
                
            if(d[kk][nn]!=-1)
                    
            return d[kk][nn];
                
            if(nn<3*kk)
                    d[kk][nn]
            =INF;
                
            else if(kk==0)
                    d[kk][nn]
            =0;
                
            else
                {
                    d[kk][nn]
            =INF;
                    d[kk][nn]
            =min(dp(kk,nn-1),dp(kk-1,nn-2)+w[nn]);
                }
                
            return d[kk][nn];
            }
            int main()
            {
                
            /*
                freopen("data.in","r",stdin);
                freopen("data.out","w",stdout);
                //
            */
                
            long test;
                scanf(
            "%ld",&test);
                
            while(test--)
                {
                    scanf(
            "%ld%ld",&k,&n);k+=8;
                    
            for(long i=1;i<=n;i++)
                        scanf(
            "%ld",&r[i]);
                    
            //  Input
                    for(long i=1,j=n;i<j;i++,j--)
                        swap(r[i],r[j]);
                    
            for(long i=2;i<=n;i++)
                        w[i]
            =(r[i]-r[i-1])*(r[i]-r[i-1]);
                    
            for(long i=0;i<=k;i++)
                        
            for(long j=0;j<=n;j++)
                            d[i][j]
            =-1;
                    
            //  Init
                    
            //  DP
                    printf("%ld\n",dp(k,n));
                }
            return 0;
            }


            posted on 2010-02-19 21:01 lee1r 閱讀(1420) 評(píng)論(2)  編輯 收藏 引用 所屬分類: 題目分類:動(dòng)態(tài)規(guī)劃

            FeedBack:
            # re: UVa 10271 Chopsticks
            2010-08-21 09:06 | Yip
            感謝你的題解  回復(fù)  更多評(píng)論
              
            # re: UVa 10271 Chopsticks
            2012-09-02 10:48 | *^_^*
            真心膜拜  回復(fù)  更多評(píng)論
              
            亚洲精品无码久久不卡| 一本综合久久国产二区| 噜噜噜色噜噜噜久久| 国内精品综合久久久40p| 久久国产精品免费| 狠狠狠色丁香婷婷综合久久五月| 亚洲欧美日韩中文久久| 2020国产成人久久精品| 久久精品一区二区三区中文字幕| 日日噜噜夜夜狠狠久久丁香五月 | 久久综合丝袜日本网| 久久精品国产亚洲AV久| 精品一二三区久久aaa片| 久久精品中文无码资源站| 久久成人小视频| 久久久久人妻一区精品性色av| 国产精品美女久久久| 亚洲国产成人久久综合一| 免费一级做a爰片久久毛片潮| 精品久久人人爽天天玩人人妻| 国产精品久久99| 精品人妻伦九区久久AAA片69| 99热成人精品免费久久| 欧美喷潮久久久XXXXx| A级毛片无码久久精品免费| 亚洲欧美精品一区久久中文字幕| 久久久精品无码专区不卡| 国内精品久久久久久99| 亚洲中文久久精品无码ww16| 一本久久综合亚洲鲁鲁五月天| 久久天天躁狠狠躁夜夜2020一| 久久天天躁狠狠躁夜夜96流白浆| 国产精品熟女福利久久AV| 久久免费看黄a级毛片| 99久久精品免费观看国产| 久久99精品久久久久久久久久| 天天做夜夜做久久做狠狠| 久久久久亚洲AV成人网人人网站| 成人久久久观看免费毛片| 久久福利青草精品资源站| 精品亚洲综合久久中文字幕|