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]);
        }
    }
  • 相关阅读:
    linux驱动开发学习一:创建一个字符设备
    如何高效的对有序数组去重
    找到缺失的第一个正整数
    .NET不可变集合已经正式发布
    中国人唯一不认可的成功——就是家庭的和睦,人生的平淡【转】
    自己动手搭建 MongoDB 环境,并建立一个 .NET HelloWorld 程序测试
    ASP.NET MVC 中如何用自定义 Handler 来处理来自 AJAX 请求的 HttpRequestValidationException 错误
    自己动手搭建 Redis 环境,并建立一个 .NET HelloWorld 程序测试
    ServiceStack 介绍
    一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL
  • 原文地址:https://www.cnblogs.com/jk17211764/p/9677400.html
Copyright © 2011-2022 走看看