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

            pku2168 Joke with Turtles 區(qū)間DP 注意~

            題目大意:

            有N只可愛的小海龜在賽跑。詢問每只小海龜它是第幾名,它會回答你兩個數(shù),ai,bi,分別表示在它前面的小海龜數(shù)和在它后面的小海龜數(shù)。接著你發(fā)現(xiàn)其中有些小海龜對你撒了謊,因為根據(jù)他們的說法你根本沒法給他們排隊!但是你是善良的,你不希望有很多小海龜在撒謊,想找出最少有哪幾只小海龜在撒謊。(注意:小海龜?shù)拿慰赡苁遣⒘械模。?/span>

             

            分析:

            若一只海龜說了真話,那么該海龜?shù)奈恢靡欢ㄊ窃趨^(qū)間[ai+1,n-bi] 上。若有k只海龜選擇了相同的區(qū)間 ,則根據(jù)并列關系,該區(qū)間最多能同時擁有min{n-ai-bi,k}只海龜(多出來的海龜肯定是說謊的,預先排除掉)。可以計算出每個區(qū)間最多能有多少只海龜,把數(shù)值看做區(qū)間的“權”。則問題轉化為,在一些帶權區(qū)間中,選出權和最大的區(qū)間,使它們之間不能互相重疊。

             

            算法:

            算出每個出現(xiàn)過的區(qū)間的“權”vi ,接下來的算法就是動態(tài)規(guī)劃了。先按右端點坐標從小到大排序,令pi 為在區(qū)間 i左邊的且與之無公共點的最大區(qū)間編號,設狀態(tài)f[i] 為在前i 個區(qū)間中可選出區(qū)間的最大權和,則狀態(tài)轉移方程為f(i)=max(f(i-1),f(pi)+vi) ,說真話海龜?shù)淖畲髷?shù)量就是最后一個區(qū)間的f(i) 值。
            論文:/Files/yzhw/range.rar

            注意,在區(qū)間類問題中,要合理設計狀態(tài),究竟狀態(tài)表示的是前i個區(qū)間(第i個區(qū)間不一定取)還是第i個區(qū)間一定要取的前i個區(qū)間。

             1# include <iostream>
             2# include <map>
             3# include <vector>
             4# include <cstring>
             5# include <cstdio>
             6using namespace std;
             7vector<int> ans;
             8map<int,vector<int> > refer;
             9# define pos(a,b) (((b)<<10)|(a))
            10struct node
            11{
            12   int s,e,val,per;
            13}
            ran[1001];
            14int dp[1001];
            15int path[1001];
            16bool used[1001];
            17int c=1;
            18int searchper(int pos)
            19{
            20    int s=1,mid,e=c;
            21    e--;
            22    while(s<=e)
            23    {
            24       mid=(s+e)/2;
            25       if(ran[mid].e>=pos)
            26         e=mid-1;
            27       else
            28         s=mid+1;
            29    }

            30    return e;
            31}

            32int main()
            33{
            34    int n;
            35    scanf("%d",&n);
            36    for(int i=0;i<n;i++)
            37    {
            38      int a,b;
            39      scanf("%d%d",&a,&b);
            40      if(a+b+1>n)
            41        ans.push_back(i);
            42      else
            43      {
            44        if(refer[pos(a+1,n-b)].size()<n-b-a)
            45         refer[pos(a+1,n-b)].push_back(i);
            46        else
            47         ans.push_back(i);
            48      }

            49    }

            50    for(map<int,vector<int> >::iterator i=refer.begin();i!=refer.end();i++)
            51    {
            52       ran[c].s=(i->first)&1023;
            53       ran[c].e=((i->first)>>10);
            54       ran[c++].val=(i->second).size();
            55    }

            56    for(int i=1;i<c;i++)
            57      ran[i].per=searchper(ran[i].s);
            58    dp[0]=0;
            59    path[0]=-1;
            60    for(int i=1;i<c;i++)
            61    {
            62       if(dp[i-1]>dp[ran[i].per]+ran[i].val)
            63          path[i]=0,dp[i]=dp[i-1];
            64       else
            65          path[i]=1,dp[i]=dp[ran[i].per]+ran[i].val;
            66    }

            67    memset(used,false,sizeof(used));
            68    int p=c-1;
            69    while(p)
            70    {
            71      if(path[p])
            72      {
            73         used[p]=true;
            74         p=ran[p].per;
            75      }

            76      else
            77         p--;
            78    }

            79    for(int i=1;i<c;i++)
            80      if(!used[i])
            81         for(int j=0;j<refer[pos(ran[i].s,ran[i].e)].size();j++)
            82            ans.push_back(refer[pos(ran[i].s,ran[i].e)][j]);
            83    printf("%d",ans.size());
            84      for(int i=0;i<ans.size();i++)
            85       printf(" %d",ans[i]+1);
            86      printf("\n");
            87    return 0;
            88}

            89
            90

            posted on 2010-11-02 02:37 yzhw 閱讀(335) 評論(0)  編輯 收藏 引用 所屬分類: DP

            <2010年10月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            導航

            統(tǒng)計

            公告

            統(tǒng)計系統(tǒng)

            留言簿(1)

            隨筆分類(227)

            文章分類(2)

            OJ

            最新隨筆

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            久久精品国产只有精品66| 国产成人久久激情91| 久久久久亚洲AV成人网| AV狠狠色丁香婷婷综合久久 | 国产一久久香蕉国产线看观看 | 久久综合狠狠色综合伊人| 色妞色综合久久夜夜| 久久国产劲爆AV内射—百度| 一本大道久久香蕉成人网| 国产精品久久久久久五月尺| 欧美午夜精品久久久久久浪潮| 97超级碰碰碰碰久久久久| 国产精品女同一区二区久久| 99久久99久久精品国产| 国产精品久久久99| 99久久久久| 久久久久久久综合日本| 性做久久久久久久久| 99久久香蕉国产线看观香| 精品国产乱码久久久久软件| 久久天天躁狠狠躁夜夜avapp| 久久人人爽人人爽人人AV东京热| 久久青青草原精品国产| 99精品国产在热久久| 青青草原综合久久| 久久久精品视频免费观看| 欧美性大战久久久久久| 丁香色欲久久久久久综合网| 久久夜色精品国产噜噜亚洲AV| 久久天天躁狠狠躁夜夜网站| 久久成人影院精品777| 精品久久久久久国产牛牛app| 色婷婷久久久SWAG精品| 伊人久久大香线蕉综合影院首页| 久久久久久毛片免费播放| 97久久精品人人澡人人爽| 久久有码中文字幕| 无码超乳爆乳中文字幕久久 | 国产精品久久久久AV福利动漫| 四虎国产精品免费久久5151| 久久综合成人网|