这题是动态规划,需要:打表,字符数组,动态规划。
状态表示:dp[i][j][k]表示的是有i个A,j个B和k个C满足要求的有多少种
转移方程:dp[i][j][k]=dp[i-1][j][k]+dp[i][j-1][k]+dp[i][j][k-1]
边界:dp[0][0][0]=1;
因为会暴int,暴long long所以转换成字符数组来操作
#include<bits/stdc++.h>
using namespace std;
int n;
char dp[65][65][65][110];
void add(int i,int j,int k)
{
for(int l=1;l<=100;l++)
{
if(i-1 >= j && j >= k &&i-1>=0&&dp[i-1][j][k][l]!=0)
dp[i][j][k][l] += dp[i-1][j][k][l];
if(i >= j-1 && j-1 >= k &&j-1>=0&&dp[i][j-1][k][l]!=0)
dp[i][j][k][l] += dp[i][j-1][k][l];
if(i >= j && j >= k-1 &&k-1>=0&&dp[i][j][k-1][l]!=0)
dp[i][j][k][l] += dp[i][j][k-1][l];
}
for(int l=1;l<=100;l++)
{
int temp=dp[i][j][k][l]/10;
dp[i][j][k][l+1]+=temp;
dp[i][j][k][l]%=10;
}
}
int main()
{
dp[0][0][0][1]=1;
for(int i=0;i<=60;i++)
for(int j=0;j<=60;j++)
for(int k=0;k<=60;k++)
if(i>=j&&j>=k&&i+j+k)
add(i,j,k);
while(~scanf("%d",&n))
{
int flag=0;
for(int i=100;i>=1;i--)
{
if(dp[n][n][n][i]) flag=1;
if(flag)
printf("%c",dp[n][n][n][i]+'0');
}
printf("\n\n");
}
return 0;
}