当前位置: 代码迷 >> 综合 >> 递推dp合集 (折线分割平面 HDU - 2050 考新郎 HDU - 2049 阿牛的EOF牛肉串 HDU - 2047 LELE的RPG难题 HDU - 2045)
  详细解决方案

递推dp合集 (折线分割平面 HDU - 2050 考新郎 HDU - 2049 阿牛的EOF牛肉串 HDU - 2047 LELE的RPG难题 HDU - 2045)

热度:42   发布时间:2024-01-19 08:00:52.0

人称“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\n",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];}elsedp[i][j]=dp[i-1][0]+dp[i-1][1];}}printf("%lld\n",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\n",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\n",a[n]);}
}