约瑟夫环问题

来源:互联网 发布:国家数据统计数据库 编辑:程序博客网 时间:2024/06/07 01:14

设有n个人,从0..n-1,从0号开始,每k个杀死,第一次杀死k-1号,问最后死的是谁。

设f(n,k)表示最后死的那个人,则f(1,k)=0,只有一个人时,最后死的是0号,又有f(n,k)=(f(n-1,k)+k)%n,杀死一个人后,重新排序,一一对应,注意n是可变的。

递归版本:

    private static int recursiveJoseph(int n, int k) {        if (n == 1) {            return 0;        }        return (recursiveJoseph(n - 1, k) + k) % n;    }

动态规划非递归版本:

    private static int joseph(int n, int k) {        int[] dp = new int[n];        for (int i = 1; i < n; i++) {            dp[i] = (dp[i - 1] + k) % (i + 1);        }        return dp[n - 1];    }


0 0
原创粉丝点击