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

            pku3691 DNA repair 自動機+DP

            題意:
            給出一個DNA序列,和若干病毒DNA片段,問最少修改DNA的次數使得DNA序列中不包含病毒

            解法:
            首先構造DFA(再次犯了和福州現場賽一樣的錯誤,沒有+結束標記狀態的轉移。。。。WA了N久),然后就是在狀態機上的DP了
            令dp[i]][j]為當前在自動機第i個節點上時suffix(j)成為合法子串需要修改的最少次數。下面狀態轉移就簡單了。。(這種狀態轉移通過方程和難描述,大家看程序吧,我寫的很清楚地~)

            代碼:
              1import java.io.*;
              2import java.util.Arrays;
              3public class Main {
              4
              5    /**
              6     * @param args
              7     */

              8    static class node
              9    {
             10        node nxt[]=new node[4];
             11        int id=0;
             12        boolean end=false;
             13        node pre=null;
             14    }

             15    static node head=null,buffer[]=new node[1500],q[]=new node[1500];
             16    static int s=-1,e=-1,dp[][]=new int[1005][1005];
             17    static int c=0;
             18    static String str;
             19    static void clear(node pos)
             20    {
             21        Arrays.fill(pos.nxt, null);
             22        pos.end=false;
             23        pos.pre=null;
             24    }

             25    static void insert(String str)
             26    {
             27        node p=head;
             28        for(int i=0;i<str.length();i++)
             29        {
             30            int nxt=0;
             31            switch(str.charAt(i))
             32            {
             33                case 'A':nxt=0;break;
             34                case 'C':nxt=1;break;
             35                case 'G':nxt=2;break;
             36                case 'T':nxt=3;break;
             37            }
            ;
             38            if(p.nxt[nxt]==null)
             39            {
             40                clear(buffer[c]);
             41                p.nxt[nxt]=buffer[c++];
             42            }

             43            p=p.nxt[nxt];
             44        }

             45        p.end=true;
             46    }

             47    static void makeper()
             48    {
             49        s=e=-1;
             50        node p=head;
             51        for(int i=0;i<4;i++)
             52            if(p.nxt[i]==null)
             53                p.nxt[i]=p;
             54            else
             55            {
             56                p.nxt[i].pre=p;
             57                q[++e]=p.nxt[i];
             58            }

             59        while(s!=e)
             60        {
             61            p=q[++s];
             62            for(int i=0;i<4;i++)
             63            {
             64                node pre=p.pre;
             65                while(pre.nxt[i]==null) pre=pre.pre;
             66                if(p.nxt[i]==null)
             67                    p.nxt[i]=pre.nxt[i];
             68                else
             69                {
             70                    p.nxt[i].pre=pre.nxt[i];
             71                    p.nxt[i].end=(p.nxt[i].end||pre.nxt[i].end);
             72                    q[++e]=p.nxt[i];
             73                }

             74            }

             75        }

             76    }

             77    static int solve(int pos,node p)
             78    {
             79        if(p.end) return 2000;
             80        else if(pos==str.length()) return 0;
             81        else if(dp[p.id][pos]!=-1return dp[p.id][pos];
             82        else
             83        {
             84            dp[p.id][pos]=0;
             85            switch(str.charAt(pos))
             86            {
             87            case 'A':
             88                dp[p.id][pos]+=Math.min(Math.min(solve(pos+1,p.nxt[0]),solve(pos+1,p.nxt[1])+1),Math.min(solve(pos+1,p.nxt[2])+1,solve(pos+1,p.nxt[3])+1));
             89                break;
             90            case 'C':
             91                dp[p.id][pos]+=Math.min(Math.min(solve(pos+1,p.nxt[0])+1,solve(pos+1,p.nxt[1])),Math.min(solve(pos+1,p.nxt[2])+1,solve(pos+1,p.nxt[3])+1));
             92                break;
             93            case 'G':
             94                dp[p.id][pos]+=Math.min(Math.min(solve(pos+1,p.nxt[0])+1,solve(pos+1,p.nxt[1])+1),Math.min(solve(pos+1,p.nxt[2]),solve(pos+1,p.nxt[3])+1));
             95                break;
             96            case 'T':
             97                dp[p.id][pos]+=Math.min(Math.min(solve(pos+1,p.nxt[0])+1,solve(pos+1,p.nxt[1])+1),Math.min(solve(pos+1,p.nxt[2])+1,solve(pos+1,p.nxt[3])));
             98                break;
             99            }
            ;
            100            return dp[p.id][pos];
            101
            102        }

            103    }

            104    public static void main(String[] args) throws IOException{
            105        BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
            106        int count=1;
            107        for(int i=0;i<buffer.length;i++)
            108        {
            109            buffer[i]=new node();
            110            buffer[i].id=i;
            111        }

            112        while(true)
            113        {
            114            int num=Integer.parseInt(in.readLine());
            115            if(num==0break;
            116            c=1;
            117            clear(buffer[0]);
            118            head=buffer[0];
            119            while((num--)!=0)
            120              insert(in.readLine());
            121            for(int i=0;i<c;i++)
            122                Arrays.fill(dp[i],-1);
            123            makeper();
            124            str=in.readLine();
            125            int ans=solve(0,head);
            126            if(ans>=2000) System.out.println("Case "+count+++": -1");
            127            else System.out.println("Case "+count+++""+ans);
            128        }

            129
            130    }

            131
            132}

            133

            posted on 2011-01-12 13:21 yzhw 閱讀(241) 評論(0)  編輯 收藏 引用 所屬分類: DPstring algorithm

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

            導航

            統計

            公告

            統計系統

            留言簿(1)

            隨筆分類(227)

            文章分類(2)

            OJ

            最新隨筆

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            久久久国产亚洲精品| 精品久久久久久无码中文字幕一区| 欧美亚洲国产精品久久蜜芽| 久久国产精品一区二区| 久久综合九色综合欧美就去吻| 麻豆av久久av盛宴av| 国产精品久久久久影院嫩草| 88久久精品无码一区二区毛片| 亚洲国产精品嫩草影院久久| 国内精品久久久久影院日本| 久久久中文字幕日本| 97久久精品无码一区二区| 亚洲国产日韩欧美综合久久| 性高湖久久久久久久久| 欧美久久一区二区三区| 欧美精品一本久久男人的天堂| 7777精品伊人久久久大香线蕉| 久久精品国产免费| 亚洲精品乱码久久久久久蜜桃图片 | 国产—久久香蕉国产线看观看| 一本色道久久综合狠狠躁篇 | 蜜臀av性久久久久蜜臀aⅴ麻豆| 国产成人久久精品麻豆一区 | 国产一级做a爰片久久毛片| 一本色综合久久| 久久国产成人亚洲精品影院| 久久天天躁狠狠躁夜夜躁2O2O| 亚洲精品国产自在久久| 久久99国产一区二区三区| 久久久国产精品网站| 久久99精品久久久久子伦| 亚洲综合熟女久久久30p| 久久这里只精品99re66| 日批日出水久久亚洲精品tv| 久久久久九九精品影院| 亚洲国产综合久久天堂| 久久久久久无码国产精品中文字幕| 岛国搬运www久久| 欧美午夜A∨大片久久| 一级A毛片免费观看久久精品| 欧美日韩成人精品久久久免费看|