SSL-ZYC 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;
}
posted @ 2018-05-12 15:45  全OI最菜  阅读(88)  评论(0编辑  收藏  举报