动态规划解决应用题:奇偶发牌洗牌

题目描述

动态规划解决应用题:奇偶发牌洗牌_第1张图片
这道题想法不难,当前步的状态取决于上一步的状态,很明显想到动态规划DP,关键是注意好细节。下面附上代码,可能写的有些瑕疵,欢迎指正。

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    //牌数
    int n = sc.nextInt();
    //洗牌次数
    int k = sc.nextInt();
    //牌
    int[] arr = new int[n];
    //dp表示每次洗牌后的序列
    int[][] dp = new int[k + 1][n];

    for (int i = 0; i < n; i++) {
        arr[i] = sc.nextInt();
        dp[0][i] = arr[i];
    }
    int mid = n / 2;
    //偶数张牌为true
    boolean flag = (n % 2) == 0;
    //开始洗牌
    for (int i = 1; i <= k; i++) {
        //偶数张牌
        if (flag) {
            //若是奇数次洗牌
            if (i % 2 == 1) {
                for (int j = 0; j < n; j++) {
                    if (j % 2 == 0) {
                        dp[i][j] = arr[j / 2];
                    } else {
                        dp[i][j] = arr[(n + j) / 2];
                    }
                }
            } else {
                //偶数次洗牌
                for (int j = 0; j < n; j++) {
                    if (j % 2 == 0) {
                        dp[i][n - j - 1] = arr[mid - 1 - j];
                    } else {
                        dp[i][n - 1 - j] = arr[n - j];
                    }
                }
            }
        } else {
            //第一张牌不变
            dp[i][0] = arr[0];
            //若是奇数次洗牌
            if (i % 2 == 1) {
                for (int j = 1; j < n; j++) {
                    if (j % 2 != 0) {
                        dp[i][j] = arr[j / 2 + 1];
                    } else {
                        dp[i][j] = arr[(n - 1 + j) / 2];
                    }
                }
            } else {
                //偶数次洗牌
                for (int j = 1; j < n; j++) {
                    if (j % 2 != 0) {
                        dp[i][j] = arr[(n + j) / 2];
                    } else {
                        dp[i][n - 1 - j] = arr[j / 2];
                    }
                }
            }
        }
        //打印最后结果
        for(int i=0;i

你可能感兴趣的:(数据结构与算法)