【解题报告】[动态规划] RQNOJ - PID38 / 串的记数

时间:2022-06-25 19:40:52

原题地址:http://www.rqnoj.cn/problem/38

解题思路:

  状态表示:dp[i][j][k]表示i个A,j个B,k个C组成的满足条件的字符串的个数

  初始状态:dp[0][0][0]=1。

  状态转移方程:dp[i][j][k]=dp[i-1][j][k]+dp[i][j-1][k]+dp[i][j][k-1]  其中要满足i>j>k>0。

 要注意的是,答案非常大,要用大数模板。。。Orz

 大数模板就不贴了,就贴动态规划的部分:

部分代码:

 BigNum dp[][][];
int d()
{
int i,j,k;
for(i=;i<=;i++)
for(j=;j<=;j++)
for(k=;k<=;k++)
dp[i][j][k]=;
dp[][][]=;
for(i=;i<=;i++)
for(j=;j<=;j++)
for(k=;k<=;k++)
{
if(i>j) dp[i][j][k]=dp[i][j][k]+dp[i-][j][k];
if(j>k) dp[i][j][k]=dp[i][j][k]+dp[i][j-][k];
if(k>) dp[i][j][k]=dp[i][j][k]+dp[i][j][k-];
}
return ;
}
int main()
{
int N;
d();
cin>>N;
cout<<dp[N][N][N]<<endl;
return ;
}