• <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 區間DP 注意~

            題目大意:

            有N只可愛的小海龜在賽跑。詢問每只小海龜它是第幾名,它會回答你兩個數,ai,bi,分別表示在它前面的小海龜數和在它后面的小海龜數。接著你發現其中有些小海龜對你撒了謊,因為根據他們的說法你根本沒法給他們排隊!但是你是善良的,你不希望有很多小海龜在撒謊,想找出最少有哪幾只小海龜在撒謊。(注意:小海龜的名次可能是并列的!)

             

            分析:

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

             

            算法:

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

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

             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 閱讀(343) 評論(0)  編輯 收藏 引用 所屬分類: DP

            <2010年12月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            導航

            統計

            公告

            統計系統

            留言簿(1)

            隨筆分類(227)

            文章分類(2)

            OJ

            最新隨筆

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            久久精品www人人爽人人| 国产一级持黄大片99久久| 国产亚洲色婷婷久久99精品91| 国内精品久久久久久野外| 国产免费久久精品丫丫| 久久久久久亚洲精品影院| 欧洲精品久久久av无码电影| 精品一区二区久久| 婷婷久久五月天| 成人精品一区二区久久久| 久久99热这里只频精品6| 2022年国产精品久久久久| 欧美日韩中文字幕久久久不卡 | 伊人色综合九久久天天蜜桃| 男女久久久国产一区二区三区| 国产精品VIDEOSSEX久久发布| 久久妇女高潮几次MBA| 久久久久综合中文字幕| 69久久夜色精品国产69| 久久人人爽人人人人爽AV | 亚洲精品蜜桃久久久久久| 国产亚洲成人久久| 久久Av无码精品人妻系列| 亚洲中文字幕伊人久久无码 | 99久久精品午夜一区二区| 久久国产亚洲精品| 久久精品成人免费国产片小草| 国内精品久久国产大陆| 日产精品久久久久久久| 久久婷婷人人澡人人爽人人爱 | 久久精品一本到99热免费| 亚洲精品国产综合久久一线| 久久久久一级精品亚洲国产成人综合AV区| 久久久久亚洲AV成人片 | 99久久综合国产精品二区| 国产精品久久99| 色综合合久久天天综合绕视看| 久久国产精品久久精品国产| 久久99精品国产99久久| 韩国无遮挡三级久久| 97久久国产亚洲精品超碰热|