zoukankan      html  css  js  c++  java
  • SSLZYC 2416 条形图

    题目大意:
    这里写图片描述


    思路:

    1.DFS

    考场推了半天这道题,没发现什么规律,于是打了一个DFS就跑。。。

    #include <iostream>
    using namespace std;
    
    int n;
    long long sum;
    
    void dfs(int x,int k) 
    {
        if (x>n||k==0)
        {
            sum++;
            return;
        }
        for (int i=0;i<=min(k,n-x+1);i++) dfs(x+1,i);
    }
    
    int main()
    {
        cin>>n;
        dfs(1,999);
        cout<<sum-1;
        return 0;
    }

    2.打表

    深搜不行,打个表不行?
    事实证明:还是不行。。。
    当n>20时DFS就跑不动了,等了20min都没出来。。。

    #include <cstdio>
    using namespace std;
    
    int main()
    {
        scanf("%d",&n);
        if(n==1) puts("1");
        if(n==2) puts("4");
        if(n==3) puts("13");
        if(n==4) puts("41");
        if(n==5) puts("131");
        if(n==6) puts("428");
        if(n==7) puts("1429");
        if(n==8) puts("4861");
        if(n==9) puts("16795");
        if(n==10) puts("58785");
        if(n==11) puts("208011");
        if(n==12) puts("742899");
        if(n==13) puts("2674439");
        if(n==14) puts("9694844");
        if(n==16) puts("129644789");
        if(n==17) puts("477638699");
        if(n==18) puts("1767263189");
        return 0;
    }

    3.DP

    正解出场!!!
    首先,要用高精度!
    方程:f[i][j][k]=f[i-1][j][k]+f[i][j-1][k]+t;


    代码:

    #include <cstdio>
    using namespace std;
    
    const int maxn=100; 
    int n,f[101][101][maxn+1],t,o,a[maxn+1];
    
    int main()
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
        {
            f[i][0][maxn]=1;  //初始化
            for (int j=1;j<=i;j++)
            {
                t=0;  //进位
                for (int k=maxn;k>=1;k--)  //高精度
                {
                    f[i][j][k]=f[i-1][j][k]+f[i][j-1][k]+t;
                    t=f[i][j][k]/10;
                    f[i][j][k]%=10;
                }
            } 
        }
        for (int i=1;i<=n;i++)
         for (int j=maxn;j>=1;j--)  //求第一行有n个的情况的总和(即答案)
         {
            o=f[n][i][j]+a[j]+t;
            t=o/10;
            a[j]=o%10;
         }
        int i=1;
        while (a[i]==0) i++;
        for (int j=i;j<=maxn;j++) printf("%d",a[j]);  //高精度专用输出
        return 0;
    }
  • 相关阅读:
    第六章 优化服务器设置--高性能MySQL 施瓦茨--读书笔记
    skip-external-locking --mysql配置说明
    mysql配置文件my.cnf详解
    Response.Redirect 打开新窗口的两种方法
    .net中Response.End() 和Response.Redirect("http://dotnet.aspx.cc");
    onclientclick与onclick的问题.
    a href="javascript:void(0)" 是什么意思?加不加上有什么区别?
    ashx是什么文件
    CSS里的 no-repeat
    css中 repeat-x 的简单用法
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313065.html
Copyright © 2011-2022 走看看