Regular Words
http://acm.hdu.edu.cn/showproblem.php?pid=1502
题目其实就是一个排列组合的问题
有n个ABC 排列有多少种排列方式 但是得保证 排列之后都能拆成ABC的模式 必须是按顺序的
排列到最后又转化成了dp的问题
最后总结出来一个公式
dp[i][j][k] = dp[i-1][j][k]+dp[i][j-1][k]+dp[i][j][k-1]
其中 i >= j >= k
这个题目的输出格式貌似有问题
直接上代码
#include"stdio.h"
#include"string.h"
typedef char NUM[100];
NUM dp[61][61][61];
/**
* 大树相加
*
* @param x 第一个大数
* @param y 第二个大数
*/
void add(char *x,char *y)
{
int i;
for(i=0;i<99;i++)
{
x[i]+=y[i];
x[i+1]+=(x[i]/10);
x[i]%=10;
}
}
int main()
{
memset(dp,0,61*61*61*sizeof(NUM));
dp[0][0][0][0]=1;
int A,B,C,n;
for(A=1;A<=60;A++)
for(B=0;B<=A;B++)
for(C=0;C<=B;C++)
{
/**
* 满足关系式 a >= b >= c 才会计算
*/
if(A>B)
{
/**
* 当 b < c 的话 dp[A][B][C] = 0;
*/
add(dp[A][B][C],dp[A-1][B][C]);
}
if(B>C)
{
/**
* 满足这个条件的话,只有 A>= B dp[A][B][C] 才有值;
*/
add(dp[A][B][C],dp[A][B-1][C]);
}
if(C>0)
{
add(dp[A][B][C],dp[A][B][C-1]);
}
}
while(scanf("%d",&n)!=EOF)
{
int i=99;
/**
* 去除开头的0
*/
while(dp[n][n][n][i]==0)
i--;
while(i>=0)
printf("%d",dp[n][n][n][i--]);
printf("\n\n");
}
return 0;
}