Problem K: RGB
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 2962 Solved: 747
Description
人称AC之神的QIGe最近一直忙着培养NOI高手,为了鼓励NOI高手, QiGe做了若干雨花石项链,作为对表现优秀的选手的奖励.他会挑选一个雨花石作为这串项链的开始,然后一个接一个连起来,现在他有三种颜色的雨花石,红(Red)、绿(Green)、蓝(Blue),做项链的时候他要求每相邻的2个雨花石不能相同的颜色,尽管最后一步把首尾连接起来的工作QiGe不需要去做,但也必须保证首尾2个雨花石它们是不同颜色。你知道QiGe有多少种串项链的方法吗?
Input
输入数据包含多个测试实例,每个测试实例占一行,由一个整数N组成,(0<n<=50)。
Output
对于每个测试实例,请输出全部的满足要求的排法,每个实例的输出占一行。
Sample Input
1
2
Sample Output
3
6
HINT
2020.05.29更新:
再一次碰到这个题。这次想证明:
设dp[n]为第n个点的所有状态数量,属性为总和。
我们讨论:n点和n-2那个点的同色和不同色的情况
那么过程如下:
同色的话就是完全等价dp[n-1]的个数,因为n-2和n同色,就不影响n是什么颜色的放入,不管n放什么不会影响n-1的状态。所以这个状态是dp[n-1]
不同色的话,假设,我们看n-2为G,那么n为R或者n-2为R,n为G,实际上就是讨论n-1这个点是什么颜色,n-1这个点总共有三个颜色。我们讨论其中一个,假设n-1为B,那么这个状态的数量为dp[n-2][R]+dp[n-2][G];同理n-1为G的时候,数量为dp[n-2][G]+dp[n-2][B];同理n-1为R的时候,数量为dp[n-2][G]+dp[n-2][B];
然后你把六个加起来,就是等价于dp[n-2]*2的状态数量。
再加上前面的dp[n-1];
所以推出来dp[n]=dp[n-1]+dp[n-2]*2
第一次碰到的时候:
看到这题第一想法是高中接触过的圆排列,用排列组合算n=3,n=4,n=5发现和朋友对不上。一看发现这题目项链是横着的。就是 。--。--。--。--。,然后首尾不同色,而我想的是圆,重新想了后发现 1- 3 2-6 3-6 4-18 5-30,其实这里规律不太好找,如果时间多用排列组合去推n=6时规律一眼就能看出来。 通常我们是拿题目给的数据当递推起始条件,但是这里n=3时也是6,所以可能是从第3项去找规律的。
在草稿纸上算的时候n=4时 6*(1+2),猜测这个1是a[n-1]的,2是2*a[n-2]的,因为毕竟这时候两个数都是6 接下去验证
算n=5时 6*(1+2+2) 里面出现的6*(1+2)是a[n-1]的,6*2是2*a[n-2]的,验证完毕。但是这题递推没搞出来的话考试时间还多的话可以去算n=6的情况,讨论比较多,排列的知识也还给高中老师差不多了,所以这题还是有一些难度的。
#include<stdio.h>
long long int a[100];
int main(void)
{
long long int n,i;
a[0]=0;a[1]=3;a[2]=6;a[3]=6;
while(scanf("%lld",&n)!=EOF)
{
for(i=4;i<=n;i++)
a[i]=a[i-2]*2+a[i-1]; 注意是long long, long的时候打50炸成2了
printf("%lld\n",a[n]);
}
return 0;
}