レーザースタイル
8002 ワード
タイトルの説明
x星の盛大な祝日は雰囲気を高めるために、30台の机光器で一列に並び、宇宙に光柱を打ち出す.デバッグをインストールしたところ、なぜか隣接する2台のレーザが同時に開かないことがわかりました!王は、このようなバグが存在する場合、全部で何種類のレーザー効果を出すことができるか知りたいと思っています.明らかに、3台の機械しかなければ、全部で5つのスタイルになることができます.つまり、すべて閉めて(sorry、この時は声がなくて、これも1つです)1台を開けて、3種類で2台を開けて、1種類30台だけではよくありません.王はあなたに手伝ってもらうしかありません.30台のレーザで形成できるパターン種数を表す整数を提出する必要がある.
コード1
暴力的な列挙は、バイナリで30個のランプを点灯させるため、0~2の30回-1の回数を列挙し、隣接する2つの1の場合を除去するだけである.
コード2
動的に計画する.x番目のビットが1の配列を1つの2次元配列f[x][1]で表す.f[x][0]はx位が0の配列を示し、f[x][1]の前面は0のみであるため、状態遷移方程式はf[x][1]=f[x-1][0]、f[x][0]の前面は0でも1でもある可能性があるため、f[x][0]=f[x-1][0]+f[x-1][1]となる.
x星の盛大な祝日は雰囲気を高めるために、30台の机光器で一列に並び、宇宙に光柱を打ち出す.デバッグをインストールしたところ、なぜか隣接する2台のレーザが同時に開かないことがわかりました!王は、このようなバグが存在する場合、全部で何種類のレーザー効果を出すことができるか知りたいと思っています.明らかに、3台の機械しかなければ、全部で5つのスタイルになることができます.つまり、すべて閉めて(sorry、この時は声がなくて、これも1つです)1台を開けて、3種類で2台を開けて、1種類30台だけではよくありません.王はあなたに手伝ってもらうしかありません.30台のレーザで形成できるパターン種数を表す整数を提出する必要がある.
コード1
暴力的な列挙は、バイナリで30個のランプを点灯させるため、0~2の30回-1の回数を列挙し、隣接する2つの1の場合を除去するだけである.
#include
using namespace std;
int get(int x,int k)// x k 1
{
return x>>k&1;
}
int main()
{
int cnt=0;
for(int i=0;i<1<<30;i++)
{
bool flag=true;
for(int j=1;j<30;j++)
{
if(get(i,j)&&get(i,j-1))
{
flag=false;
break;
}
}
cnt+=flag;
}
cout<<cnt<<endl;
}
コード2
動的に計画する.x番目のビットが1の配列を1つの2次元配列f[x][1]で表す.f[x][0]はx位が0の配列を示し、f[x][1]の前面は0のみであるため、状態遷移方程式はf[x][1]=f[x-1][0]、f[x][0]の前面は0でも1でもある可能性があるため、f[x][0]=f[x-1][0]+f[x-1][1]となる.
#include
using namespace std;
int f[40][2];
int main()
{
f[0][0]=1;
for(int i=1;i<=30;i++)
{
f[i][0]=f[i-1][0]+f[i-1][1];
f[i][1]=f[i-1][0];
}
cout<<f[30][0]+f[30][1];
}