• 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;
    }
  • 相关阅读:
    HDOJ2066 一个人的旅行 floyd
    手动添加数据源时DataGridViewComboBoxCell值出问题解决方法
    可伸缩的Form窗体!
    SharpMap项目Web控件学习!
    MVC和MVP的初步理解
    ArcEngine编辑功能(五)
    胡言乱语:实体具有继承关系的空间数据库设计方法?
    WinForm单例窗体的实现
    4. 模板模式和建造者模式
    Oracle笔记(0):在Win2008系统上安装Oracle11g实践
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313065.html
Copyright © 2020-2023  润新知