这题被边界问题坑了,我以为不会出事的,结果出了大事,cout,printf,还有不输出的答案全是不一样的,这波操作看得我一脸懵逼。。
这题还挺简单的。用 表示走了 步,向右移动 个单位,向上移动 个单位,DP一波预处理出来。最后暴力枚举到哪个点,统计答案。
#include <bits/stdc++.h>
using namespace std;
const int N=55;
const int p=1e9+7;
int n,f[N][2*N][2*N];
class WolfPackDivTwo {
public:
int calc( vector <int> x, vector <int> y, int m );
};
int WolfPackDivTwo::calc(vector <int> x, vector <int> y, int m) {
memset(f,0,sizeof f);
f[0][m][m]=1;
for(int i=1;i<=m;i++)
for(int j=0;j<=m<<1;j++)
for(int k=0;k<=m<<1;k++){
f[i][j][k]=(f[i-1][j][k+1]+f[i-1][j+1][k])%p;
if (j-1>=0) f[i][j][k]=(f[i][j][k]+f[i-1][j-1][k])%p;
if (k-1>=0) f[i][j][k]=(f[i][j][k]+f[i-1][j][k-1])%p;
}
// f[i][j][k]=((f[i-1][j+1][k]+f[i-1][j-1][k])%p+(f[i-1][j][k+1]+f[i-1][j][k-1])%p)%p;
n=x.size();
int ans=0;
for(int j=-m;j<=50+m;j++)
for(int k=-m;k<=50+m;k++){
int bo=0;
long long sum=1;
for(int i=0;i<n;i++){
if (abs(x[i]-j)+abs(y[i]-k)>m){
bo=1;
break;
} else{
sum=sum*f[m][j-x[i]+m][k-y[i]+m]%p;
//if (j==2&&k==0)printf("f[%d][%d][%d]=%d\n",m,j-x[i]+m,k-y[i]+m,f[m][j-x[i]+m][k-y[i]+m]);
}
}
if (!bo){
ans=(ans+sum)%p;
//printf("%d %d %lld\n",j,k,sum);
//cout<<sum<<endl;
//cout<<bo<<endl;
}
}
return ans;
}