• <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的次數(shù)使得DNA序列中不包含病毒

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

            代碼:
              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 閱讀(248) 評論(0)  編輯 收藏 引用 所屬分類: DP 、string algorithm

            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            導航

            統(tǒng)計

            公告

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

            留言簿(1)

            隨筆分類(227)

            文章分類(2)

            OJ

            最新隨筆

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            久久精品国产精品青草| 欧美一级久久久久久久大片| 久久久久亚洲精品天堂| 久久久久久国产精品免费无码 | 色综合久久中文综合网| 久久精品综合一区二区三区| av色综合久久天堂av色综合在 | 国产农村妇女毛片精品久久| 久久妇女高潮几次MBA| 久久精品国产亚洲一区二区三区| 伊人久久大香线蕉av不卡| 久久精品无码一区二区app| 久久99亚洲网美利坚合众国| 亚洲AⅤ优女AV综合久久久| 久久久国产精品福利免费| 伊人久久久AV老熟妇色| 欧洲性大片xxxxx久久久| 狠狠色丁香久久综合五月| 综合人妻久久一区二区精品| 日日狠狠久久偷偷色综合0| 久久久久久久综合日本亚洲| 久久香蕉超碰97国产精品| 久久精品国产男包| 亚洲精品无码专区久久同性男| 国产成人精品久久二区二区| 亚洲精品乱码久久久久久自慰| 伊人久久五月天| 欧美精品九九99久久在观看| 久久强奷乱码老熟女网站| 久久av高潮av无码av喷吹| 91秦先生久久久久久久| 国产午夜精品久久久久九九电影 | 色狠狠久久AV五月综合| 伊人久久亚洲综合影院| 亚州日韩精品专区久久久| 亚洲欧美日韩久久精品| 午夜福利91久久福利| 蜜桃麻豆WWW久久囤产精品| A级毛片无码久久精品免费| 亚洲中文久久精品无码| 国内精品久久久久影院优|