代码:
#include<iostream>
using namespace std;
int n,m,ans=-1,f[105][105][5][5][3];
int main() {
cin>>n>>m;
f[1][1][0][0][0]=1;
f[1][1][1][1][1]=1;
for(int i=1;i<=n;i++) f[i][1][0][1][0]=f[i-1][1][0][1][0]+1;
for(int j=1;j<=m;j++) f[1][j][1][0][0]=f[1][j-1][1][0][0]+1;
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
f[i][j][0][0][0]=f[i-1][j-1][0][0][0];
f[i][j][0][1][0]=f[i-1][j][0][1][0]+f[i-1][j][0][1][1];
f[i][j][1][0][0]=f[i][j-1][1][0][0]+f[i][j-1][1][0][1];
for(int k1=0;k1<=2;k1++) {
for(int k2=0;k2<=1;k2++) {
if(k1-k2<0) continue;
for(int k3=0;k3<=2;k3++) {
for(int k4=0;k4<=1;k4++) {
if(k3-k4<0) continue;
for(int k5=0;k5<=1;k5++) {//cout<<i<<' '<<j<<' '<<k1<<' '<<k2<<' '<<k3<<' '<<k4<<' '<<k5
if(!f[i-1][j-1][k3-k4][k1-k2][k5]) continue;
f[i][j][1][1][0]+=(f[i][j-1][1][k1][k2]*f[i-1][j][k3][1][k4])/f[i-1][j-1][k3-k4][k1-k2][k5];
f[i][j][1][2][0]+=(f[i][j-1][1][k1][k2]*f[i-1][j][k3][2][k4])/f[i-1][j-1][k3-k4][k1-k2][k5];
f[i][j][2][1][0]+=(f[i][j-1][2][k1][k2]*f[i-1][j][k3][1][k4])/f[i-1][j-1][k3-k4][k1-k2][k5];
f[i][j][2][2][0]+=(f[i][j-1][2][k1][k2]*f[i-1][j][k3][2][k4])/f[i-1][j-1][k3-k4][k1-k2][k5];
f[i][j][1][1][1]+=f[i-1][j-1][0][0][0];
f[i][j][1][2][1]+=f[i-1][j][0][1][0]+f[i-1][j][0][1][1];
f[i][j][2][1][1]+=f[i][j-1][1][0][0]+f[i][j-1][1][0][1];
f[i][j][2][2][1]+=(f[i][j-1][1][k1][k2]*f[i-1][j][k3][1][k4])/f[i-1][j-1][k3-k4][k1-k2][k5];
}
}
}
}
}
}
}
for(int i=0;i<=2;i++)
for(int j=0;j<=2;j++)
for(int k=0;k<=1;k++)
ans+=f[n][m][i][j][k];
cout<<ans<<'\n';
return 0;
}
代码输出总是0,但只是想问问各位大佬我的思路可不可行:设f[i][j][a][b][1/0]表示前i行j列中第i行有a个棋子,第j行有b个棋子,1/0表示这个点放没放,转移的话不太好描述,都体现在代码中了。第一次自己做DP题(不看题解的情况下),希望大佬们指导一下,十分感谢。