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

            最新隨筆

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            人妻精品久久无码区| 国产福利电影一区二区三区久久久久成人精品综合 | 久久久久九国产精品| 一本一道久久a久久精品综合 | 日韩亚洲欧美久久久www综合网| 久久国产精品-国产精品| 久久久亚洲精品蜜桃臀| 国色天香久久久久久久小说 | 超级碰久久免费公开视频| 看全色黄大色大片免费久久久| 少妇高潮惨叫久久久久久| 91精品久久久久久无码| 亚洲国产一成人久久精品| 91久久精品无码一区二区毛片| 久久久久久久97| 久久久久99精品成人片三人毛片| 婷婷久久香蕉五月综合加勒比| 久久久中文字幕日本| 久久精品国产第一区二区三区 | 亚洲色大成网站www久久九| 国产激情久久久久影院老熟女免费| 国产aⅴ激情无码久久| 久久久99精品一区二区| 久久青青草原综合伊人| 久久久噜噜噜www成人网| 久久大香萑太香蕉av| 激情综合色综合久久综合| 99久久国产综合精品麻豆| 午夜精品久久久久久毛片| 久久香综合精品久久伊人| 久久国产成人亚洲精品影院| 亚洲国产精品久久久久| 久久99中文字幕久久| 精品久久久久久无码专区不卡| 国产精品一区二区久久精品涩爱| 久久久久国产一区二区| 理论片午午伦夜理片久久 | 国产成人精品久久免费动漫| 亚洲国产欧美国产综合久久| 99精品国产综合久久久久五月天| 国产成人久久精品一区二区三区 |