讨论 / 动态规划+高进度加法
huhang1996 2013-11-04 19:51:09
点我顶贴 收藏 删除
#include<iostream>

#include<memory.h>

using namespace std;

int f[61][61][61][100];

int len[61][61][61];

int n;

int maxer(int q,int w)

{

if(q>w){return q;}

else{return w;}

}

void sum(int x1,int y1,int z1,int x2,int y2 ,int z2)

{

//cout<<sum<<endl;

int jin=0;

int leng=0;

leng=maxer(len[x1][y1][z1],len[x2][y2][z2]);

for(int i=1;i<=leng+1;i++)

{

f[x1][y1][z1][i]+=(f[x2][y2][z2][i]+jin);

jin=0;

if(f[x1][y1][z1][i]>=10)

{

jin=(int)f[x1][y1][z1][i]/10;

f[x1][y1][z1][i]=f[x1][y1][z1][i];

}

}

len[x1][y1][z1]=leng;

if(f[x1][y1][z1][leng+1]!=0)

{len[x1][y1][z1]++;}

//cout<<x1<<" "<<y1<<" "<<z1<<endl;

// for(int i=len[x1][y1][z1];i>=1;i--)

// cout<<f[x1][y1][z1][i]<<"-";

// cout<<endl;

}

int main()

{

cin>>n;

memset(len,0,sizeof(len));

f[0][0][0][1]=1;

len[0][0][0]=1;

for(int i=0;i<=n;i++)

for(int j=0;j<=i;j++)

for(int k=0;k<=j;k++)

{

if(i>j)

{sum(i,j,k,i-1,j,k);}

if(j>k)

{sum(i,j,k,i,j-1,k);}

if(k>0)

{sum(i,j,k,i,j,k-1);}

}

for(int i=len[n][n][n];i>=1;i--)

cout<<f[n][n][n][i];

//system("pause");

return 0;

}

THX打表哥的测试数据,自己测评全部AC,卡塔兰三阶啥的才不知道呢~~~

但最近RQNOJ3测评拙计,各种吞代码,神错误= =

但一定我的递推是对的!!对!就是这样的说

for(int i=0;i<=n;i++)

for(int j=0;j<=i;j++)

for(int k=0;k<=j;k++)

{

if(i>j)

{sum(i,j,k,i-1,j,k);}

if(j>k)

{sum(i,j,k,i,j-1,k);}

if(k>0)

{sum(i,j,k,i,j,k-1);}

}

递推公式HERE

#1 huhang1996@2013-11-04 19:56:07
回复 删除
F[I][J][K]是前缀有i个A,j个B(噗--),k个C时的方案数,由于该串自身是自身的最大前缀,所以F[n][n][n]就是解
查看更多回复
提交回复