zoukankan      html  css  js  c++  java
  • 递推dp合集 (折线分割平面 HDU

    人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过多方打探,某资深Cole终于知道了原因,原来,LELE最近研究起了著名的RPG难题:

    有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.

    以上就是著名的RPG难题.

    如果你是Cole,我想你一定会想尽办法帮助LELE解决这个问题的;如果不是,看在众多漂亮的痛不欲生的Cole女的面子上,你也不会袖手旁观吧?
     

    Input

    输入数据包含多个测试实例,每个测试实例占一行,由一个整数N组成,(0<n<=50)。

    Output

    对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。

    Sample Input

    1
    2

    Sample Output

    3
    6
    #include<queue>
    #include<algorithm>
    #include <stdio.h>
    #include <stdlib.h>
    #include<iostream>
    using namespace std;
    long long int s[60][3],i,j,k;
    int main()
    {
        s[1][0]=1;
        s[1][1]=1;
        s[1][2]=1;
        s[2][0]=2;
        s[2][1]=2;
        s[2][2]=2;
        s[3][0]=2;
        s[3][1]=2;
        s[3][2]=2;
        for(i=4;i<51;i++)
        {
            s[i][0]=s[i-1][0]+2*s[i-2][0];
            s[i][1]=s[i-1][1]+2*s[i-2][1];
            s[i][2]=s[i-1][2]+2*s[i-2][2];
        }
        for(;;)
        {
            long long n;
            if(scanf("%lld",&n)==EOF)
                break;
            printf("%lld
    ",s[n][0]+s[n][1]+s[n][2]);
        }
    }
    

    今年的ACM暑期集训队一共有18人,分为6支队伍。其中有一个叫做EOF的队伍,由04级的阿牛、XC以及05级的COY组成。在共同的集训生活中,大家建立了深厚的友谊,阿牛准备做点什么来纪念这段激情燃烧的岁月,想了一想,阿牛从家里拿来了一块上等的牛肉干,准备在上面刻下一个长度为n的只由"E" "O" "F"三种字符组成的字符串(可以只有其中一种或两种字符,但绝对不能有其他字符),阿牛同时禁止在串中出现O相邻的情况,他认为,"OO"看起来就像发怒的眼睛,效果不好。

    你,NEW ACMer,EOF的崇拜者,能帮阿牛算一下一共有多少种满足要求的不同的字符串吗?

    PS: 阿牛还有一个小秘密,就是准备把这个刻有 EOF的牛肉干,作为神秘礼物献给杭电五十周年校庆,可以想象,当校长接过这块牛肉干的时候该有多高兴!这里,请允许我代表杭电的ACMer向阿牛表示感谢!

    再次感谢!

    Input

    输入数据包含多个测试实例,每个测试实例占一行,由一个整数n组成,(0<n<40)。

    Output

    对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。

    Sample Input

    1
    2

    Sample Output

    3
    8
    #include<queue>
    #include<algorithm>
    #include <stdio.h>
    #include <stdlib.h>
    #include<iostream>
    using namespace std;
    int main()
    {
        for(;;)
        {
    
    
        long long int dp[1000][3];
        long long int i,j,k,n;
        if(scanf("%lld",&n)==EOF)
            break;
        dp[1][0]=1;
        dp[1][1]=1;
        dp[1][2]=1;
        for(i=2;i<=n;i++)
        {
            for(j=0;j<3;j++)
            {
                if(j<2)
                {
                    dp[i][j]=dp[i-1][0]+dp[i-1][1]+dp[i-1][2];
                }
                else
                    dp[i][j]=dp[i-1][0]+dp[i-1][1];
            }
        }
        printf("%lld
    ",dp[n][0]+dp[n][1]+dp[n][2]);
        }
    }

    国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是这样的:


    首先,给每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排;
    然后,让各位新郎寻找自己的新娘.每人只准找一个,并且不允许多人找一个.
    最后,揭开盖头,如果找错了对象就要当众跪搓衣板...

    看来做新郎也不是容易的事情...

    假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能.

    Input

    输入数据的第一行是一个整数C,表示测试实例的个数,然后是C行数据,每行包含两个整数N和M(1<M<=N<=20)。

    Output

    对于每个测试实例,请输出一共有多少种发生这种情况的可能,每个实例的输出占一行。

    Sample Input

    2
    2 2
    3 2

    Sample Output

    1
    3
    #include<queue>
    #include<algorithm>
    #include <stdio.h>
    #include <stdlib.h>
    #include<iostream>
    typedef long long LL;
    using namespace std;
    LL s[60],jie[30],i,j,k;
    int main()
    {
        s[1]=0;
        s[2]=1;
        for(i=3;i<21;i++)
        {
            s[i]=(i-1)*(s[i-1]+s[i-2]);
        }
        jie[0]=1;jie[1]=1;jie[2]=2;
        for(i=3;i<21;i++)
        {
            jie[i]=jie[i-1]*i;
        }
        int T;
        scanf("%d",&T);
        while(T--)
        {
            LL m,n;
            scanf("%lld %lld",&n,&m);
            printf("%lld
    ",jie[n]/jie[m]/jie[n-m]*s[m]);
    
        }
        return 0;
    }

    我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。

    Input

    输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示折线的数量。
     

    Output

    对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。
     

    Sample Input

    2
    1
    2

    Sample Output

    2
    7
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    typedef long long LL;
    #define INF 1e-9
    #define MAXN 1e9
    int main()
    {
        LL a[10010],i,j,k,t;
        a[1]=2;a[2]=7;
        for(i=3;i<=10001;i++)
        {
            a[i]=a[i-1]+4*(i-1)+1;
        }
        LL T;
        scanf("%lld",&T);
        while(T--)
        {
            LL n;
            scanf("%lld",&n);
            printf("%lld
    ",a[n]);
        }
    }
  • 相关阅读:
    6Linux用户身份与文件权限
    5Linux流程控制语句-if、for、while、case语句、计划任务
    4Linux环境变量、Vim、Shell脚本
    3Linux常用命令
    2Linux常用命令-Liunu就该这么学
    1安装Linux
    Citrix XenApp工作原理
    Citrix XenApp登录服务器过程详解
    0初识Linux
    我的电脑-磁盘 不显示菜单栏和工具栏解决方法
  • 原文地址:https://www.cnblogs.com/jk17211764/p/9677400.html
Copyright © 2011-2022 走看看