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

            Climber.pI的OI之路

            Through the darkest dark,may we see the light.

            NOIp 2005 過(guò)河

            線性dp,但是范圍很變態(tài). = =

            30%的方程很容易想到:
            [狀態(tài)] f[i]表示從0到i點(diǎn)最少踩到的石子數(shù), stone[i]表示i點(diǎn)有無(wú)石子;
            [方程] f[i] = max{f[i-j] + stone[i]} (S<=j<=T)
            [初始化] f[0] = 0, 其他賦值為無(wú)限大.

            在實(shí)現(xiàn)的時(shí)候需要把方程變化為 f[i+j] = max{f[i] + stone[i+j]},不然在[1,S]會(huì)出現(xiàn)很詭異的結(jié)果.
             
            由于m遠(yuǎn)遠(yuǎn)小于l,整個(gè)序列上的石子非常稀疏.所以可以減少狀態(tài).但是目前對(duì)此還是有些不解.
            某種思路是,將石子間距大[1,2,..,9,10]=2520的逐次減至小于2520.注意要在收尾增加0和l兩個(gè)"石子",這樣計(jì)算新的l較為方便.


             1#include<stdio.h>
             2#include<iostream>
             3using namespace std;
             4#define MAXN 1000000;
             5bool L[200000= {0};
             6int f[200000= {0}, stone[110= {0};
             7int min(int x, int y){return x < y ? x : y;}
             8void swap(int x, int y){
             9    int k = stone[x];
            10    stone[x] = stone[y];
            11    stone[y] = k;
            12}

            13int main(){
            14    int l, S, T, M, i, j;
            15    scanf("%d%d%d%d"&l, &S, &T, &M);
            16    for (i = 1; i <= M; i++) scanf("%d"&stone[i]);
            17    stone[0= 0;
            18    for (i = 1; i < M; i++)
            19        for (j = i+1; j <= M; j++)
            20            if (stone[i] > stone[j]) swap(i, j);
            21    stone[++M] = l;
            22    for (i = 1; i <= M; i++){
            23        while (stone[i] - stone[i-1> 2520) stone[i] -= 2520;
            24        if (i != M) L[stone[i]] = 1;
            25    }

            26    l = stone[M--];
            27    for (i = 0; i <= l; i++) f[i] = MAXN; f[0= 0;
            28    for (i = 0; i < l; i++)
            29        for (j = S; j <= T; j++){
            30            int k = i+j;
            31            if (i + j >= l) k = l;
            32            f[k] = min(f[k], f[i]+L[i]);
            33        }

            34    printf("%d\n", f[l]);
            35}

            posted on 2010-10-08 21:54 Climber.pI 閱讀(843) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): 動(dòng)態(tài)規(guī)劃

            Feedback

            # re: NOIp 2005 過(guò)河 2010-10-09 08:53 ftiasch

            2520恰好是1, 2, ..., 10的最小公倍數(shù)。原理就是可以證明說(shuō)狀態(tài)函數(shù)的值肯定會(huì)出現(xiàn)大段的重復(fù)。在理論上可以保證的就是2520。更多的分析應(yīng)該用裴蜀定理來(lái)做。  回復(fù)  更多評(píng)論   

            # re: NOIp 2005 過(guò)河 2011-09-08 13:30 PZYR

            #include<stdio.h>
            #include<iostream>
            using namespace std;
            #define MAXN 1000000;
            bool L[200000] = {0};
            int f[200000] = {0}, stone[110] = {0};
            int min(int x, int y){return x < y ? x : y;}
            void swap(int x, int y){
            int k = stone[x];
            stone[x] = stone[y];
            stone[y] = k;
            }
            int main(){
            int l, S, T, M, i, j;
            scanf("%d%d%d%d", &l, &S, &T, &M);
            for (i = 1; i <= M; i++) scanf("%d", &stone[i]);
            stone[0] = 0;
            for (i = 1; i < M; i++)
            for (j = i+1; j <= M; j++)
            if (stone[i] > stone[j]) swap(i, j);
            stone[++M] = l;
            for (i = 1; i <= M; i++){
            while (stone[i] - stone[i-1] > 2520) stone[i] -= 2520;
            if (i != M) L[stone[i]] = 1;
            }
            l = stone[M--];
            for (i = 0; i <= l; i++) f[i] = MAXN; f[0] = 0;
            for (i = 0; i < l; i++)
            for (j = S; j <= T; j++){
            int k = i+j;
            if (i + j >= l) k = l;
            f[k] = min(f[k], f[i]+L[i]);
            }
            printf("%d\n", f[l]);
            }  回復(fù)  更多評(píng)論   

            区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 亚洲狠狠综合久久| 久久久久久久亚洲Av无码| 国产美女久久精品香蕉69| 久久久久久久久久久免费精品| 久久久久久久精品妇女99| 国产成人久久精品一区二区三区 | 中文字幕无码av激情不卡久久| 日本欧美久久久久免费播放网| 久久久久亚洲精品男人的天堂| 精品999久久久久久中文字幕| 亚洲欧美一区二区三区久久| 国产三级观看久久| 久久国产精品久久国产精品| 久久综合伊人77777麻豆| 波多野结衣中文字幕久久| 一本综合久久国产二区| 中文精品久久久久国产网址| 久久香蕉国产线看观看精品yw| 女同久久| 欧美精品丝袜久久久中文字幕 | 亚洲国产精品久久久久网站| 亚洲国产精品无码久久久不卡 | 久久精品国产日本波多野结衣| 亚洲国产成人久久精品动漫| 久久人妻少妇嫩草AV无码专区| 久久亚洲av无码精品浪潮| 久久线看观看精品香蕉国产| 国产精品99久久不卡| www.久久热| 国产一区二区精品久久凹凸 | 久久这里只精品99re66| 久久无码国产| 亚洲Av无码国产情品久久| 久久婷婷国产剧情内射白浆| 亚洲国产精品成人久久蜜臀| 欧美精品福利视频一区二区三区久久久精品 | 久久亚洲欧美日本精品| 国产L精品国产亚洲区久久| 久久国产精品久久精品国产| 国产伊人久久|