动态规划和大数加法的结合,设 dp[i][j][k] 表示字符串中 A 的数量为 i,B 的数量为 j, C的数量为 k,且满足 i >= j >= k 的字符串的个数。
状态转移方程为 dp[i][j][k] = dp[i - 1][j][k] + dp[i][j - 1][k] + dp[i][j][k - 1]
#include <iostream>
using namespace std;
const int MAXN = 65;
const int MAXT = 100;
char dp[MAXN][MAXN][MAXN][MAXT]; //前3维表示dp[i][j][k],第4维存储大数值
//打表
void init()
{
dp[0][0][0][1] = 1;
for (int i = 1; i < MAXN; i++) //动态规划
{
for (int j = 0; j <= i; j++)
{
for (int k = 0; k <= j; k++)
{
for (int t = 1; t < MAXT - 2; t++) //大数加法
{
dp[i][j][k][t] += dp[i - 1][j][k][t];
if (j >= 1)
dp[i][j][k][t] += dp[i][j - 1][k][t];
if (k >= 1)
dp[i][j][k][t] += dp[i][j][k - 1][t];
dp[i][j][k][t + 1] += dp[i][j][k][t] / 10;
dp[i][j][k][t] = dp[i][j][k][t] % 10;
}
if (i == j && j == k)
{
int temp = MAXT;
while (!dp[i][j][k][temp])
--temp;
dp[i][j][k][0] = temp; //第0个位置存储大数位数
}
}
}
}
}
int main()
{
init();
int n;
while (cin >> n)
{
int num = dp[n][n][n][0];
for (int i = num; i >= 1; i--)
cout << char(dp[n][n][n][i] + '0');
cout << endl << endl;
}
return 0;
}
继续加油。