美文网首页动态规划动态规划
计蒜客 等和的分隔子集(优化)

计蒜客 等和的分隔子集(优化)

作者: 小熊_宝宝 | 来源:发表于2017-12-21 03:28 被阅读0次

    上一期版本请见计蒜客 等和的分隔子集

    解析

    上一期的解法超时了,这期我们来优化一下,仔细观察上期程序,当dp[number][n]中的number很大,但n很小的时候要运行很多次,所以我们来优化这一点,加入附加条件number最大只能是1-n的前n项和。所以我们附加一个number>(1-n)*n/2的情况下,返回0

    顺便把dp[number][n]中n很大的情况下进行优化,当number<n时,dp[number][n]=dp[number][number]就可以了

    以上思路提交成功Accepted

    代码

    long dp[1000][50]={0};

    long F(int number,int n)

    {

    if(dp[number][n]!=0)

    {

    }

    else if(number==0)

    {

    dp[number][n]=1;

    }

    else if(n==0)

    {

    return 0;

    }

    else if(number>(1+n)*n/2)

    {

    return 0;

    }

    else if(number>=n)

    {

    dp[number][n]=F(number,n-1)+F(number-n,n-1);

    }

    else

    {

    dp[number][n]=F(number,number);

    }

    return dp[number][n];

    }

    int main()

    {

    int N;

    scanf("%d",&N);

    int number=N*(N+1)/2;

    if(number%2==0)

    {

    number=number/2;

    printf("%lld\n",F(number,N)/2);

    }

    else

    {

    printf("0\n");

    }

    return 0;

    }

    相关文章

      网友评论

        本文标题:计蒜客 等和的分隔子集(优化)

        本文链接:https://www.haomeiwen.com/subject/nokowxtx.html