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思路来计算的。最前面贴出来的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值