简单DP
将串分成三种情况:末尾为A,末尾为B,末尾为C。则dp[i][t][k]=dp[i-1][t][k]+dp[i][t-1][k]+dp[i][t][k-1]。
#include <iostream>
#include <string>
using namespace std;
int dp[65][65][65][11];
const int INF=100000000;
int main()
{
dp[0][0][0][0]=0;
for (int i=1;i<=60;i++)
dp[i][0][0][0]=1;
for (int i=1;i<=60;i++)
{
for (int t=1;t<=i;t++)
{
for (int k=0;k<=t;k++)
{
int r=0;
for (int j=0;j<=10;j++)
{
dp[i][t][k][j]=dp[i-1][t][k][j]+dp[i][t-1][k][j]+r;
r=dp[i][t][k][j]/INF;
dp[i][t][k][j]%=INF;
}
if (k>0)
{
for (int j=0;j<=10;j++)
{
dp[i][t][k][j]=dp[i][t][k][j]+dp[i][t][k-1][j]+r;
r=dp[i][t][k][j]/INF;
dp[i][t][k][j]%=INF;
}
}
}
}
}
int n;
while (cin>>n)
{
int p=0;
int p1=0;
for (int i=9;i>=0;i--)
{
if (dp[n][n][n][i]!=0||i==0)
{
if (p==0)
{
p=1;
cout<<dp[n][n][n][i];
}
else
{
int s=1;
int t=1;
for (t=0;t<=10;t++,s=s*10)
{
if (dp[n][n][n][i]<s)
break;
}
//cout<<t<<endl;
for (int k=1;k<=8-t;k++)
{
cout<<0;
p1=1;
}
cout<<dp[n][n][n][i];
}
}
}
cout<<endl<<endl;
/*if (p1==1)
cout<<"AAAAAA"<<endl;*/
}
}