//前三个是不同长度下最大方法,后三个是不同长度下1的个数
int dp[30][6]={{1,0,0,1,0,0},{0,1,0,0,0,0},{1,1,1,1,1,0}};
int main()
{
int T;scanf(“%d”,&T);
for(int i =3;i<30;i++)
{
dp[i][0]=dp[i-1][1]+dp[i-1][2];
dp[i][1]=dp[i-2][0]+dp[i-2][2];
dp[i][2]=dp[i-3][0]+dp[i-3][1];
dp[i][3]=dp[i-1][4]+dp[i-1][5]+dp[i][0];
dp[i][4]=dp[i-2][3]+dp[i-2][5];
dp[i][5]=dp[i-3][3]+dp[i-3][4];
}
for(int num=0;num<T;num++)
{
int N;scanf(“%d”,&N);
int ways=dp[N-1][0]+dp[N-1][1]+dp[N-1][2];
int number=dp[N-1][3]+dp[N-1][4]+dp[N-1][5];
printf(“%d\n%d\n”,ways,number);
}
return 0;
}
#include<bits/stdc++.h>usingnamespacestd;#define FOR0(a,b) for(int i = a; i < b; ++i)#define FORE(a,b) for(int i = a; i <= b; ++i)typedeflonglongll;typedefpair<int,int>pii;constintf[]={1,2,3};intans=0,yi=0,n;voiddfs(intsum,intpre,intfir){if(sum>n)return;if(sum==n){// cout << yi << endl;ans++;yi+=fir;return;}for(inti=0;i<3;++i){if(f[i]==pre)continue;dfs(sum+f[i],f[i],fir+(f[i]==1));}}intmain(){intT;scanf("%d",&T);while(T--){ans=0,yi=0;scanf("%d",&n);dfs(0,0,0);cout<<ans<<endl<<yi<<endl;}return0;}
DP
include
//前三个是不同长度下最大方法,后三个是不同长度下1的个数
int dp[30][6]={{1,0,0,1,0,0},{0,1,0,0,0,0},{1,1,1,1,1,0}};
int main()
{
int T;scanf(“%d”,&T);
for(int i =3;i<30;i++)
{
dp[i][0]=dp[i-1][1]+dp[i-1][2];
dp[i][1]=dp[i-2][0]+dp[i-2][2];
dp[i][2]=dp[i-3][0]+dp[i-3][1];
dp[i][3]=dp[i-1][4]+dp[i-1][5]+dp[i][0];
dp[i][4]=dp[i-2][3]+dp[i-2][5];
dp[i][5]=dp[i-3][3]+dp[i-3][4];
}
for(int num=0;num<T;num++)
{
int N;scanf(“%d”,&N);
int ways=dp[N-1][0]+dp[N-1][1]+dp[N-1][2];
int number=dp[N-1][3]+dp[N-1][4]+dp[N-1][5];
printf(“%d\n%d\n”,ways,number);
}
return 0;
}
直接暴搜都能过。。
DFS
include
using namespace std;
define FOR0(a,b) for(int i = a; i < b; ++i)
define FORE(a,b) for(int i = a; i <= b; ++i)
typedef long long ll;
typedef pair pii;
const int f[] = {1,2,3};
int ans = 0, yi = 0, n;
void dfs(int sum, int pre, int fir) {
if(sum > n) return;
if(sum == n) {
// cout << yi << endl;
ans++;
yi+=fir;
return;
}
for(int i = 0; i < 3; ++i) {
if(f[i] == pre) continue;
dfs(sum+f[i],f[i],fir+(f[i]==1));
}
}
int main() {
int T;
scanf(“%d”, &T);
while(T–) {
ans = 0, yi = 0;
scanf(“%d”, &n);
dfs(0,0,0);
cout << ans << endl << yi << endl;
}
return 0;
}
include
using namespace std;
int number;
int t;
int N[31];
void cl()
{
for(int i=1;i<=30;i++)
{
N[i]=0;
}
}
void f(int k,int n,int depth)
{
int d=depth+1;
if(n<0)
{
return;
}
if(n==0)
{
number++;
for(int i=1;i<=depth;i++)
{
if(N[i]==1)
t++;
}
return;
}
if(k==0)
{
N[d]=1;
f(1,n-1,d);
N[d]=2;
f(2,n-2,d);
N[d]=3;
f(3,n-3,d);
}
if(k==1)
{
N[d]=2;
f(2,n-2,d);
N[d]=3;
f(3,n-3,d);
}
if(k==2)
{
N[d]=1;
f(1,n-1,d);
N[d]=3;
f(3,n-3,d);
}
if(k==3)
{
N[d]=1;
f(1,n-1,d);
N[d]=2;
f(2,n-2,d);
}
}
int main()
{
int T;
int n;
cin>>T;
for(int i=0;i>n;
number=0;
t=0;
cl();
f(0,n,0);
cout<<number<<endl;
cout<<t<<endl;
}
return 0;
}