LCS-動態規劃

先上運行結果截圖:


 

 

 

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

public class Main10 {

    static class Position {
        private int x;
        private int y;
        private int times;
    }

    static void addPosition(int x, int y, List<Position> positionList) {
        Position position = new Position();
        position.x = x;
        position.y = y;
        positionList.add(position);
    }

    static boolean equals(int[][] dp, int xi, int yi, char[] x, char[] y) {
/*         return dp[xi][yi] == dp[xi - 1][yi - 1] + 1
         && dp[xi][yi] == dp[xi - 1][yi] + 1
         && dp[xi][yi] == dp[xi][yi - 1] + 1;*/
        return x[xi - 1] == y[yi - 1];
    }

    static boolean xequals(int[][] dp, int i, int yLength) {
        for (int index = 0; index <= yLength; index++) {
            if (dp[i][index] != dp[i - 1][index]) {
                return false;
            }
        }

        return true;
    }

    static boolean yequals(int[][] dp, int j, int xLength) {
        for (int index = 0; index <= xLength; index++) {
            if (dp[index][j] != dp[index][j-1]) {
                return false;
            }
        }

        return true;
    }

    static boolean allequals(int[][] dp, int xi, int yi) {
        return dp[xi][yi] == dp[xi - 1][yi - 1] && dp[xi][yi] == dp[xi - 1][yi] && dp[xi][yi] == dp[xi][yi - 1];
    }


    public static void main(String[] args) {

        char[] chars = "ABCDEFGHIKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray();
        int length = chars.length ;

        int MAX = 15 ;

        char[] y = new char[MAX];
        char[] x = new char[MAX];

        Random random = new Random();

        for (int i = 0; i < MAX; i++) {
            int index = random.nextInt(1000000);
            x[i] = chars[index % length];
            int index2 = random.nextInt(1000000);
            y[i] = chars[index2 % length];
        }

        x= "tpDFsGjTkAyMMnL".toCharArray();
        y = "MgdeieCAuKEvCkB".toCharArray();

        int[][] dp = new int[x.length + 1][y.length + 1];

        for (int xi = 0; xi < x.length; xi++) {
            for (int yi = 0; yi < y.length; yi++) {

                if (x[xi] == y[yi]) {
                    dp[xi + 1][yi + 1] = dp[xi][yi] + 1;
                } else {
                    dp[xi + 1][yi + 1] = Integer.max(dp[xi][yi + 1], dp[xi + 1][yi]);
                }
            }
        }

        print(dp, y, x);

        int max = dp[x.length][y.length];
        StringBuilder sb = new StringBuilder();
        LinkedList<Position> positions = new LinkedList<>();

        int xi = x.length;
        int yi = y.length;




        while (true) {

            // 先進行預處理。。。
            while (xequals(dp,xi,y.length)){
                xi--;
            }

            while (yequals(dp,yi,x.length)){
                yi--;
            }

            addPosition(xi, yi, positions);

            if (equals(dp, xi, yi, x, y)) {
                xi--;
                yi--;
                max--;
                sb.append(x[xi]);
            } else {
                if (dp[xi - 1][yi] >= dp[xi][yi - 1]) {
                    xi--;
                } else {
                    yi--;
                }
            }

            if (max == 0) {
                String temp = new StringBuilder(sb.toString()).reverse().toString();
                System.out.println(temp);

                printList(positions);
                // 沿路返回
                for (; ; ) {

                    Position last = positions.getLast();
                    xi = last.x;
                    yi = last.y;
                    last.times++;

                    if (equals(dp, xi, yi, x, y)) {
                        positions.removeLast();
                        printList(positions);
                        sb.delete(sb.length() - 1, sb.length());
                        max++;

                    } else {

                        if (dp[xi][yi - 1] == dp[xi - 1][yi]) {
                            if (last.times == 2) {
                                positions.removeLast();
                                printList(positions);
                            } else {
                                yi--;
                                break;
                            }
                        } else {
                            positions.removeLast();
                            printList(positions);
                        }
                    }

                    if (positions.isEmpty()) {
                        System.exit(0);
                    }
                }
            }
        }
    }

    public static void print(int[][] dp, char[] a, char[] b) {

        int y = dp[0].length;

        System.out.print(0 + "\t");
        System.out.print(0 + "\t");

        for (int i = 1; i < y; i++) {
            System.out.print(i + "\t");
        }

        System.out.println();

        System.out.print(0 + "\t");
        System.out.print(0 + "\t");


        for (char ac : a) {
            System.out.print(ac + "\t");
        }
        System.out.println();

        for (int i = 1; i < dp.length; i++) {
            System.out.print(i + "\t");
            System.out.print(b[i - 1] + "\t");
            for (int j = 1; j < dp[0].length; j++) {
                System.out.print(dp[i][j] + "\t");
            }
            System.out.println();
        }
        System.out.println();
    }

    private static void printList(List<Position> positionList) {
        Iterator<Position> iterator = positionList.iterator();
        while (iterator.hasNext()) {
            Position next = iterator.next();
            System.out.print(String.format("(%d,%d)\t", next.x, next.y));
        }

        System.out.println();
    }
}

 

md,仍然會有重複的輸出!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章