PID38 串的记数(codevs2077)

时间:2023-03-09 00:23:08
PID38  串的记数(codevs2077)
/*
假设当前有a个A b个B c个C 用 f[a][b][c]来表示
那么如果这个串以A结尾 那就是 f[a-1][b][c]转移来的
所以构成 f[a][b][c]的串一定有一部分是 f[a-1][b][c]
同理 B C 所以:
f[a][b][c] = f[a-1][b][c]+f[a][b-1][c]+f[a][b][c-1]
至于题目里那个什么前缀什么规则 既然f[1][1][1] 合法
那么他转移出来的 f[1][1][2] f[1][2][1] f[2][1][1]自然也合法
最后输出 f[n][n][n]
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[][][][],n;
void add(int i,int j,int k,int a,int b,int c)
{
int l;
for(l=;l<=;l++)
f[i][j][k][l]=f[i][j][k][l]+f[a][b][c][l];
for(l=;l<=;l++)
if(f[i][j][k][l]>=)
{
f[i][j][k][l+]++;
f[i][j][k][l]-=;
}
}
int main()
{
cin>>n;
int i,j,k;
f[][][][]=;
f[][][][]=;
for(i=;i<=n;i++)
for(j=;j<=i;j++)
for(k=;k<=j;k++)
{
if(i>)
add(i,j,k,i-,j,k);
if(j>)
add(i,j,k,i,j-,k);
if(k>)
add(i,j,k,i,j,k-);
}
for(i=;i>=;i--)
if(f[n][n][n][i]>)
{
k=i;break;
}
for(i=k;i>=;i--)
cout<<f[n][n][n][i];
return ;
}