srm 620 div2

/**
 * User: Free
 * Date: 14-5-11
 * Time: 上午12:52
 */
public class PairGameEasy
{
  public  String able(int a, int b, int c, int d)
    {
        String Y = "Able to generate";
        String N = "Not able to generate";
        while(a!=c || b!=d){
            if(c<a || d<b){
                return  N;
            }
            if(c>d){
                c = c-d;
            }
            else if(d>c){
                d = d-c;
            }else{
                return N;
            }
        }
        if(a==c && b==d )        return Y;
        else return N;
    }
    public static void main(String args[]){
        PairGameEasy pairGameEasy = new PairGameEasy();
        System.out.println(pairGameEasy.able(1,2,3,8));
        System.out.println(pairGameEasy.able(1,2,2,1));
        System.out.println(pairGameEasy.able(2,2,2,999));

    }


}

 

topcoder上分3种解决

(1)递归

    public  String able(int a, int b, int c, int d)
    {
        String Y = "Able to generate";
        String N = "Not able to generate";
        {
        if(a>c || b>d)return N;
        if(able(a+b,b,c,d).equals(N))
            return able(a,a+b,c,d);
        else
            return Y;
    }

 

 

(2)DP

 

    public  String able(int a, int b, int c, int d)
    {
        String Y = "Able to generate";
        String N = "Not able to generate";
        int dp[][] =new int[2000][2000];
        dp[a][b]=1;
        for(int i=a;i<=c;i++){
                     

            for(int j=b;j<=d;j++) {
                   if(dp[i][j]==1){
                       dp[i+j][j]=1;
                       dp[i][i+j]=1;
                   }
            }
        }
        if(dp[c][d]==1){
            return Y;
        }
            
        return N;

    }

 

 

这个dp方法思路好,虽然在本程序中,效率低,算法不太好,但思想不错

 

(3)我用的是递减思路,应该是算法复杂度最小的,采用了gcd思路来计算的。最前面贴出来的。

你可能感兴趣的:(srm620)