uva 10404 - Bachet's Game

来源:互联网 发布:淘宝上卖高仿的处罚 编辑:程序博客网 时间:2024/05/16 08:13
import java.io.*;import java.util.*;public class stackingbox {    public static void main(String[] args) throws Exception {        Scanner scan = new Scanner(System.in);        while(scan.hasNextInt()){            int n = scan.nextInt();            int num = scan.nextInt();            int set[] = new int[num];            for(int i=0;i<num;i++){                set[i] = scan.nextInt();            }            int dp[] = new int[n+1];            dp[0] = 0;            for(int i=0;i<=n;i++){                for(int j=0;j<num;j++){                    if(i+set[j]<=n)                        dp[i+set[j]] = Math.max(dp[i+set[j]], 1-dp[i]);                }            }            if(dp[n]==1){                System.out.println("Stan wins");            }else{                System.out.println("Ollie wins");            }        }    }}

带有博弈的dp,开始想的是二维dp,主要是USACO上做过一个类似的,那个题目是每个石头有重量,然后求最大重量。

结果在纸上一推,发现一维dp足够。DP保存两位选手在最利于自己的选择下的输赢结果。

这个题目就是比如一次可以拿1个,3个或者8个,那么dp[i] 的值取决于dp[i-1], dp[i-3], dp[i-8].

如果dp[i-1], dp[i-3], dp[i-8]都是先手赢(这时先手是ollie), 那么作为最开始的stain没的法选择,选哪种都要输,所以dp[i]一定为0,即stain输

如果dp[i-1], dp[i-3], dp[i-8]中有一个先手必输(ollie输), 那么最开始的stain必定选这个让ollie输,stain赢。


这个题目数据比较好,貌似过了样例就行了,1Y很开心