TopCoder SRM 573 Div2 1000 WolfPackDivTwo

这题被边界问题坑了,我以为不会出事的,结果出了大事,cout,printf,还有不输出的答案全是不一样的,这波操作看得我一脸懵逼。。

这题还挺简单的。用 f [ i ] [ j ] [ k ] 表示走了 i 步,向右移动 j 个单位,向上移动 k 个单位,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;
}

猜你喜欢

转载自blog.csdn.net/ymzqwq/article/details/82147128