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

            pku1934 LCS+二次DP構(gòu)造解 注意位壓縮只能對應無符號數(shù)

            題意很簡單,找出2個字符串的最長公共字串,并輸出所有解。
            前一個問題很簡單,后面一個問題有點小麻煩
            首先,需要在狀態(tài)轉(zhuǎn)移時記錄下所有的最優(yōu)決策,我是用一個vector來記錄的
            可以發(fā)現(xiàn),解的結(jié)構(gòu)是一個階段圖,這樣就可以用DP來構(gòu)造解,當然狀態(tài)是一個集合。
            DP其實很靈活,狀態(tài)不僅僅可以是一個數(shù)字、一個字符串,也可以是對象等。像這道題狀態(tài)轉(zhuǎn)移過程就是集合的合并,應該用左偏樹或者spaly的,我偷懶,直接用set了- -結(jié)果跑了800MS,汗。。

             1# include <iostream>
             2# include <vector>
             3# include <cstring>
             4# include <set>
             5# include <string>
             6using namespace std;
             7int dp[100][100];
             8vector<int> path[100][100];
             9char str1[100],str2[100];
            10set<string> ans[100][100];
            11# define encode(a,b) (((a)<<7)|(b))
            12int solve(int p1,int p2)
            13{
            14    if(p1<=0||p2<=0return 0;
            15    else if(dp[p1][p2]!=-1return dp[p1][p2];
            16    else
            17    {
            18        if(str1[p1]==str2[p2])
            19        {
            20           dp[p1][p2]=solve(p1-1,p2-1)+1;
            21           path[p1][p2].push_back(encode(p1-1,p2-1));
            22        }

            23        else
            24        {
            25            if(solve(p1-1,p2)==solve(p1,p2-1))
            26            {
            27               dp[p1][p2]=solve(p1-1,p2);
            28               path[p1][p2].push_back(encode(p1-1,p2));
            29               path[p1][p2].push_back(encode(p1,p2-1));
            30            }

            31            else if(solve(p1-1,p2)>solve(p1,p2-1))
            32            {
            33               dp[p1][p2]=solve(p1-1,p2);
            34               path[p1][p2].push_back(encode(p1-1,p2));
            35            }

            36            else
            37            {
            38                dp[p1][p2]=solve(p1,p2-1);
            39                path[p1][p2].push_back(encode(p1,p2-1));
            40            }

            41        }

            42        return dp[p1][p2];
            43    }

            44}

            45void makeans(int p1,int p2,int len)
            46{
            47     if(len==0)  ans[p1][p2].insert(string(""));
            48     else if(ans[p1][p2].size()!=0return;
            49     else
            50     {
            51        for(int i=0;i<path[p1][p2].size();i++)
            52        {
            53           int t1=path[p1][p2][i]>>7,t2=path[p1][p2][i]&127;
            54           if(t1==p1-1&&t2==p2-1)
            55           {
            56              makeans(p1-1,p2-1,len-1);
            57              for(set<string>::iterator it=ans[p1-1][p2-1].begin();it!=ans[p1-1][p2-1].end();it++)
            58                ans[p1][p2].insert(*it+str1[p1]);
            59           }

            60           else if(t1==p1-1)
            61           {
            62              makeans(p1-1,p2,len);
            63              ans[p1][p2].insert(ans[p1-1][p2].begin(),ans[p1-1][p2].end());
            64           }

            65           else 
            66           {
            67              makeans(p1,p2-1,len);
            68              ans[p1][p2].insert(ans[p1][p2-1].begin(),ans[p1][p2-1].end());
            69           }

            70        }

            71     }

            72}

            73int main()
            74{
            75    memset(dp,-1,sizeof(dp));
            76    cin>>str1+1>>str2+1;  
            77    makeans(strlen(str1+1),strlen(str2+1),solve(strlen(str1+1),strlen(str2+1)));
            78    for(set<string>::iterator it=ans[strlen(str1+1)][strlen(str2+1)].begin();it!=ans[strlen(str1+1)][strlen(str2+1)].end();it++)
            79       cout<<*it<<endl;
            80    //system("pause");
            81    return 0;
            82}

            83

            posted on 2010-10-29 14:13 yzhw 閱讀(145) 評論(0)  編輯 收藏 引用 所屬分類: DP

            <2011年1月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            導航

            統(tǒng)計

            公告

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

            留言簿(1)

            隨筆分類(227)

            文章分類(2)

            OJ

            最新隨筆

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            久久免费大片| 久久91精品国产91久久户| 久久中文精品无码中文字幕| 久久精品视屏| 久久久久99精品成人片直播| 99久久亚洲综合精品网站| 亚洲伊人久久成综合人影院 | 久久av免费天堂小草播放| 精品国产乱码久久久久久人妻| 精品一区二区久久| 国产精品久久久久久久app| 久久最新精品国产| 亚洲综合日韩久久成人AV| 狠狠久久综合| 99久久成人18免费网站| 欧美噜噜久久久XXX| 亚洲欧洲久久av| 久久99精品国产麻豆婷婷| 国产精品久久久久久一区二区三区| 亚洲精品国精品久久99热| 国产高潮国产高潮久久久91| 久久亚洲AV成人无码电影| 国产精品久久久久免费a∨| 久久综合九色欧美综合狠狠| 国产精品美女久久久久网| 亚洲精品乱码久久久久66| 伊人久久大香线蕉综合热线| 国产女人aaa级久久久级| 99精品久久精品一区二区| 嫩草伊人久久精品少妇AV| 精品久久久久久久久久久久久久久| 久久精品国产久精国产思思| 亚洲国产精品无码久久一区二区| 亚洲午夜精品久久久久久app| 久久精品国产精品亚洲艾草网美妙| 久久99精品久久久久久hb无码| 国内高清久久久久久| 77777亚洲午夜久久多人| 久久精品一本到99热免费| 蜜臀av性久久久久蜜臀aⅴ麻豆| 亚洲精品乱码久久久久久蜜桃图片 |