青草游戏

https://www.nowcoder.com/practice/ed0334a5e88f4662bb69374b308862d8?tpId=90&tqId=30802&tPage=2&rp=2&ru=%2Fta%2F2018test&qru=%2Fta%2F2018test%2Fquestion-ranking

博弈dp

public static void main(String[] args) {
        int n=10;
        int[] dp=new int[n+1];//dp[i]当前个数为i时等于1表示niu获胜,0表示yang获胜
        for(int i=1;i<=n;i++) {
            int flag=0;
            for(int j=1;j<=i;j*=4) {
                if(dp[i-j]==0)
                    flag=1;
            }
            dp[i]=flag;
        }
        System.out.println(dp[n]);
}

我们发现博弈只与前5有关,我们把时间复杂度缩小到常数范围

public static void main(String[] args) {
        int[] dp=new int[5];//dp[i]当前个数为i时等于1表示niu获胜,0表示yang获胜
        for(int i=1;i<5;i++) {
            int flag=0;
            for(int j=1;j<=i;j*=4) {
                if(dp[i-j]==0)
                    flag=1;
            }
            dp[i]=flag;
        }
        Scanner scan= new Scanner(System.in);
        int x=scan.nextInt();
        while(scan.hasNext()) {
            int n=scan.nextInt();
            System.out.println(dp[n%5]);
        }
    }

 

posted @ 2019-05-15 12:40  LeeJuly  阅读(175)  评论(0)    收藏  举报