大一就该开始看算法的,这对一个程序员来说至关重要
这道题用递归可以,但时间复杂度太高,位多了就不行了
下面是递归,只是为了介绍思路
递归也是写复杂了
#include<iostream>
using namespace std;
int sum=0;
void dfs(int len,int x0,int x2,int x1,int x3,string str){//r代表2、3,t代表0、1
if(!len){
if(x0&&x1&&x2&&x3){
sum++;
//cout<<"2"<<str<<endl;
}
return;
}
else{
string ss;
if(x0){
if(x1&&x3){
ss=str+"1";
dfs(len-1,x0,x2,x1+1,x3,ss);
ss=str+"3";
dfs(len-1,x0,x2,x1,x3+1,ss);
}
if(x1&&!x3){
ss=str+"1";
dfs(len-1,x0,x2,x1+1,x3,ss);
ss=str+"2";
dfs(len-1,x0,x2+1,x1,x3,ss);
ss=str+"3";
dfs(len-1,x0,x2,x1,x3+1,ss);
}
if(x3&&!x1){
ss=str+"0";
dfs(len-1,x0+1,x2,x1,x3,ss);
ss=str+"1";
dfs(len-1,x0,x2,x1+1,x3,ss);
ss=str+"3";
dfs(len-1,x0,x2,x1,x3+1,ss);
}
if((!x1)&&(!x3)){
ss=str+"0";
dfs(len-1,x0+1,x2,x1,x3,ss);
ss=str+"1";
dfs(len-1,x0,x2,x1+1,x3,ss);
ss=str+"2";
dfs(len-1,x0,x2+1,x1,x3,ss);
ss=str+"3";
dfs(len-1,x0,x2,x1,x3+1,ss);
}
}
else{
ss=str+"0";
dfs(len-1,x0+1,x2,x1,x3,ss);
if(!x3){
ss=str+"2";
dfs(len-1,x0,x2+1,x1,x3,ss);
}
ss=str+"3";
dfs(len-1,x0,x2,x1,x3+1,ss);
}
}
}
int main(){
int n;
cin>>n;
dfs(n-1,0,1,0,0,"");
cout<<sum%1000000007<<endl;
}
下面才是一个聪明的程序员该写的
#include<iostream>
using namespace std;
#define mod 1000000007
int main(){
long long n;
cin>>n;
long long state[n][6];
for(int i=0;i<n;i++){
for(int j=0;j<6;j++){
state[i][j]=0;
}
}
state[0][0]=1;
/*
0--用了2,剩0,1,3
1--用了2、0,剩1,3
2--用了2、3,剩0,1
3--用了2、0、3,剩1
4--用了2、0、1,剩3
5--用了2、3、0、1
*/
for(int i=1;i<n;i++){
state[i][0]+=state[i-1][0];
state[i][1]=(2*state[i-1][1]+state[i-1][0])%mod;
state[i][2]=(state[i-1][2]+state[i-1][0])%mod;
state[i][3]=(state[i-1][3]*2+state[i-1][1]+state[i-1][2])%mod;
state[i][4]=(state[i-1][4]*2+state[i-1][1])%mod;
state[i][5]=(state[i-1][5]*2+state[i-1][3]+state[i-1][4])%mod;
// cout<<state[i][5];
}
cout<<state[n-1][5];
}